本文共 1015 字,大约阅读时间需要 3 分钟。
#pragma pack(n) //内存对齐的指定方式
内存对齐就是不同类型的数据在内存中按照一定的规则排列。而不一定是顺序的一个接一个的排列。
比如
struct Test1
{
char c1;
short s1;
char c2;
int i;
};
struct Test2
{
char c1;
char c2;
short s1;
int i;
};
他们占的内存是不一样的。第一个占12个字节,第二个占8个字节。为什么呢?这就是内存对齐
原因如下
cpu对内存的读取不是连续的,而是分块的读取的,块的大小只能是1,2,4,8...等等。读取的数据没对齐,则需要两次总线周期访问内存,因此性能会打折扣。
而#pragma pack 可以用来指定内存对齐方式,能改变内存对齐的方式。
比如#pragma pack(1);
#pragma pack(1)
struct Test1{
char c1;
short s1;
char c2;
int i;
}; #pragma pack(1) struct Test2 {char c1;
char c2;
short s1;
int i;
};结构体占用内存大小的规则
1第一个成员起始于0偏移处。
2每个成员按其大小和pack参数中较小的一个进行对齐
偏移地址必须能被对齐参数整除,结构体成员的大小取其内部长度最大的数据成元作为其大小。
3机构体长度必须被所有对齐参数的整数倍。
编译器默认为4字节对齐。
#pragma pack(4)
struct Test1{
//对齐参数(模数) 偏移地址 大小 char c1; // 1 0 1short s1; // 2 2 2
char c2; // 1 4 1
int i; // 4 8 4
};#pragma pack(8)//注意这里有的编译器不支持8字节对齐。会自动变成4字节对齐
struct Test3
{ //对齐参数 偏移地址 大小 short c1; //2 0 2 long l; //4 4 4 }; struct Test4 { //对齐参数 偏移地址 大小 short c1; // 2 0 2 struct Test3 t3;// 4 4 8 double e; // 8 (4) 16 (12) 8 8字节对齐大小为24。4字节对齐大小为20 };学习交流群199546072
转载地址:https://blog.csdn.net/qq_39809601/article/details/81709844 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!