C++内存对齐的理解

参考:https://www.cnblogs.com/xylc/p/3780907.html

https://blog.csdn.net/QQ1910084514/article/details/80611466

首先,cpu对内存的读取是对齐的,如果cpu所读取的内存正好是被读取数据的首地址或者尾地址,那么CPU可以一次性将数据读取成功。如果cpu所读取的地址是被读取数据的中间位置,那么cpu将需要访问2次内存,将读取地址的左边的地址与右边地址的内容拼接起来,这样相对于第一种会多出一次内存读取操作。所以,为了减少cpu内存读取的次数,将数据的首尾地址进行对齐之cpu访问的地址处,这样能够提升CPU读取数据的速度。

对于结构体如何计算其内存?

结构体内存计算与编译器的默认对齐数有关,一般windows环境默认对齐数为8,linux默认对齐数为4

1.结构体内存对齐的基准取内存最大的变量的字节数与默认对齐数的较小值。
2.结构体的总内存必须是内存最大的变量的整数倍数。

struct A
{
   char a;
   int i;
   char b;
};

分析:默认对齐数为4,而结构体中内存最大的为int类型,为4个字节,所以对齐的基准为4,并且结构体的内存必须是4的倍数。

放下一个变量a后,使用了一个字节,因为基准是4,还剩下三个字节放不下i了,所以要浪费3个字节,在浪费的3个字节后放入i

然后放入b,现在总字节数为1+3+4+1=9,因为总字节数要为4的倍数,所以最终大小为12.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值