C++ 内存对齐

C++ 内存对齐

作用范围为 struct / union

一、内存对齐的规则:

1、  对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。

2、  在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行对齐。

二、

可以通过 #pragma pack(n)设置为n字节对齐 其中n 为1 2 4  8 16 。。

通过#pragma pack(show) 获得当前对齐字节


三、例子

struct testS
{
char b;
int c;
double d;
};


在给char b申请内存时偏移量为0,是sizeof(char)的倍数直接分配。

在给int c申请内存时偏移量为1,不是sizeof(int)的倍数所以要填充3个字节让偏移量达到4成为sizeof(int)的倍数然后为其分配内存。

在给double d申请内存时偏移量为8时sizeof(double)的倍数,直接分配。

所以最后sizeof(testS)的结果是16

struct testS
{
int c;
char b;
};


在testS中按照上面描述的方法进行分配内存。

分配int c时偏移量为0直接分配

分配char b时偏移量为4直接分配

但是sizeof(testS)不是5,这满足规则第二条。这只是完成了数据成员的内存对齐,还没有做结构本身的内存对齐。按照结构本身的对齐规则来说,我们要取出所有成员和#pragma pack指定的数值中较小的一个得倍数来对齐结构。所以sizeof(testS)的结果是8。

struct testS
{
short  c;
char b;
};


sizeof(testS)则为4.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值