细说C++中字节的对齐方式

本文详细介绍了C++中编译器默认的字节对齐方式,以及如何通过#pragma pack或__attribute__((aligned(n)))进行自定义对齐。内容包括成员变量按照自身类型和指定对齐方式进行对齐的规则,并通过实例解析了不同对齐方式对内存分配的影响。
摘要由CSDN通过智能技术生成

C++中字节的对齐方式可以采用编译器默认的字节对齐方式, 也可以采用自定义的对齐方式。



编译器默认字节对齐方式



1、结构体中每个成员分别按自己的方式对齐(注:对于数组如int a[3], 其对齐字节为sizeof(int))

例1:
struct test1 
{
    char c1;    //c1长度1个字节, 采用1字节对齐
    short s;    // s长度为2个字节,采用2字节对齐
    int i;      // i长度为4个字节,采用4字节对齐
    char c2;    //c2长度1个字节,采用1字节对齐
};

sizeof(test1)的结果为12。

test1 的内存分布如下(以1表示占用字节,*表示空字节)
c1 s i c2
1* 11 1111 1***


原因如下:

  • 成员c1,其偏移地址为0,占据了第1个字节。此时共分配了1个字节。
  • 成员s为short类型,占用2个字节,采用2字节对齐。已经分配的1个字节不是2的整数倍,所以编译器在c1与s之间插入1个空字节,然后为s分配2个字节。此时共分配了4个字节。
  • 成员i为int类型,占用4个字节,采用4字节对齐。已经分配的4个字节是4的整数倍,所以编译器在i与s之间不插入空字节,然后直接为i分配4个字节。此时共分配了8个字节。
  • 成员c2为char类型,占用1个字节,采用1字节对齐。已经分配的8个字节是1的整数倍,所以编译器在c2与i之间不插入空字节,然后直接为c2分配1个字节。此时共分配了9个字节。
  • 此时所有的成员已经分配完了,但test1是采用4字节对齐的(请查看第2点),9不是4的整数倍(请查看第3点),故在c2之后插件3个空字节以使test1对齐。此时共分配了12个字节,所以Sizeof(test)的结果为12。


2、复杂类型(包含结构体成员)的默认对齐方式是它最长的成员的对齐方式,这样的成员是复杂类型时,以其最长的成员的对齐方式对齐。

例2:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值