c++字节对齐

写在前面,所谓字节对齐,即是每个成员变量开始放置的位置相对结构体开始地址的偏移量是多少字节的倍数。

结构体大小初决定:

敲打首先可以确定的是:该结构体的大小肯定是最占空间的成员大小(这里是double,8bytes)的 整数倍~

不过,如果用#pragma(n) ... #pragma() ,其中n小于最占空间的成员大小,那么该结构体的大小就是n的整数倍;此外,则按默认确定结构体大小。比如说在下面结构体加上#pragma(2) ... #pragma()的话,那么结构体的大小一定是2的倍数,而不一定是8的倍数~~。

struct MyStruct 

double alpha; 
char beta; 
int theta; 
}myStruct; 


结构体大小终决定:

为上面的结构分配空间的时候,编译器根据成员变量出现的顺序和对齐方式。

惊讶先为第一个成员alpha分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;

安静接下来为第二个成员beta分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把beta存放在偏移量为8的地方满足对齐方式,该成员变量占用 sizeof(char)=1个字节;

可怜接下来为第三个成员theta分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof (int)=4的倍数,为了满足对齐方式对偏移量的约束问题,编译器自动填充3个字节,这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。

所以整个结构的大小为:sizeof(MyStruct)=8+1+ 3+4=16,其中有3个字节是编译器自动填充的,里面放了什么不能确定。


发火不过,如果用#pragma(n) ... #pragma()的话,每个变量的对齐方式就应该选择 min(2, sizeof(自己类型))【结构体中的结构体默认是自己成员变量对齐参数最大的那一个】。

比如n = 2;

惊讶先为第一个成员alpha分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为 min(2, sizeof(double))的倍数),该成员变量占用sizeof(double)=8个字节;

安静接着为第二个成员beta分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是 min(2,sizeof(double))的倍数,所以把beta存放在偏移量为8的地方满足对齐方式,该成员变量占用 sizeof(char)=1个字节;

可怜接下来为第三个成员theta分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是 min(2, sizeof(int))的倍数,为了满足对齐方式对偏移量的约束问题,编译器自动填充1个字节,这时下一个可以分配的地址对于结构的起始地址的偏移量为10,刚好是min(2, sizeof(int))的倍数,所以把type存放在偏移量为10的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+1+4=14,刚好为结构的字节边界数2(初决定~)的倍数,所以没有空缺的字节需要填充。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值