内存对齐的理解

25 篇文章 4 订阅

1.编译器默认的内存对齐规则

默认的对齐规则是一个变量的地址需要是其类型的长度的整数倍:

例如下面这个结构体:

struct A

{

char m1;

short m2;

int m3;

}

对于A变量的m1成员,其大小为1个字节,起始地址为0,可以满足整除的要求

对于A变量的m2成员,其大小为2个字节,因此起始地址1不满足被2整除,需要按照2字节对齐,因此,其起始地址为2,占用2,3两个字节

对于A变量的m3成员,其大小为4个字节,因此其起始地址4满足整除4这个要求

最终该结构的内存结构如下:

m1对齐m2m2
m3m3m3m3

2.指定对齐方式

目前可以通过pragma pack命令或者std::align手动设置对齐方式

有效对其值:是给定值#pragma pack(n)和结构体中最长数据类型长度中较小的那个。有效对齐值也叫对齐单位

上面这一句是知乎上找到的,换成自己的理解就是:

当变量的类型长度小于我们自己设置的对齐系数,那么变量的数据类型长度来对齐,反之,按照按照我们设置的对齐系数来对齐

例如:

struct struct_Test2

{

char c;

int  i;
char c1;

double d;

};

那么不主动设置对齐系数,其内存布局应该如下:

一字节一字节一字节一字节
c对齐对齐对齐
iiii
c1对齐对齐对齐
对齐对齐对齐对齐
dddd
dddd

设置了4字节对齐系数后,其内存布局中d的起始地址按照4字节对齐,而不是其类型长度8字节,可以让c1后面只补3个字节的对齐位

c1对齐对齐对齐
dddd
dddd

以上

引用:C/C++内存对齐详解 - 知乎

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值