结构体内存对齐

本文深入探讨了C++中结构体的内存对齐规则,以Visual Studio(VS)编译器为例,解释了如何计算结构体的大小。通过实例分析struct S1和S2,展示了成员变量在内存中的布局以及对齐导致的额外空间浪费。最后,介绍了嵌套结构体S3的对齐方式,揭示了内存对齐在节省内存和提高访问效率方面的重要性。
摘要由CSDN通过智能技术生成

结构体内存对齐原则
在这里插入图片描述

struct S1
{
     char a;//1字节
     char b;//4字节
     char c;//1字节
};
struct S2
{
     char a;//1字节
     int b;//1字节
     char c;//4字节
};

以编译器vs为例(vs默认对齐数为8)
对于S1而言
a从偏移量为0开始占一个字节
b大小为1,所以往下偏移量为1。
c大小为4,所以往下继续偏移4个单位。
这时候总的大小为6,最大对齐数为4,所以要浪费两个单位,所以sizeof(struct S1)为8
在这里插入图片描述
对于S2
a从偏移量为0开始,
b的对齐数为4,但是此时地址为1,所以不是4的整数倍,因此往下3个浪费3个字节,对齐到偏移量为8处。
c的对齐数为1,所以整体来说,S2占了9个单位,但是此时该结构体各个成员最大对齐数为4,根据结构体对齐原则,此时应该浪费3个单位凑成4的整数倍,所以sizeof(struct S2)为12。
在这里插入图片描述

struct S2
{    
   char a;
   int b;
   char c;
};
struct S3
{
    char m;
    struct S2 s2;
    int n;
};

对于S2此处已经了解,但对于S3嵌套了一个结构体S2
m,依旧从偏移量为0开始。
对于结构体S2,由上面知道是12个大小,最大对齐数为4,所以为了使S2在地址为4的整数倍,因此要浪费三个空间,从偏移量为4的地方开始。往后数12个
同理,n的情况一样。此时,S3全部偏移量为20,为最大对齐数4的倍数。所以sizeof(struct S3)就是为20
在这里插入图片描述
而为什么出现内存对齐呢
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值