一般的pack对齐格式分别是1,2,4,8,16.
默认的对齐格式,也就是:#pragma pack()
情况下,会在结构体中挑选占用字节最多的类型,例如double 占用8个字节,例子:
#pragma pack()
struct A
{
char c;
char c1;
int a;
double d;
};
上面的结构体长度是16.为什么是16,而不是char 8 int 8 double 8
实际上,当我们采用默认的对齐,决定存储的长度是8个字节,所以每8个字节为一组,存放数据,但是可能像上面的情况是一个字节的字符,占用了1个字节的存储空间,编译器尝试利用剩余的7个空,避免读取寄存器数值 的时候,从奇数的位置开始读取数据。所以跳过了一个1个字节。发现下一个元素刚好可以填充从第3个字节开始的位置,所以填充。现在位置移动到了第5个字节,还剩下4个字节,这一组就分配完毕了,此时遇到了一个整型,刚刚好。
如果指定了字节对齐的个数,情况就会不一样:
#pragma pack(1)
struct A
{
char c;
char c1;
int a;
double d;
};
变成了14个字节。
总结如下:如果没有指定字节对齐,挑选字节长度最长的类型作为对齐的字节数。然后分配对齐字节数的空间,尝试将结构体的成员,往里面塞,注意存在的开始地址必须是偶数。
转载于:https://blog.51cto.com/fengyuzaitu/1591664