C语言内存对齐规则总结

第一步:确认对齐字节
第二步:填充内存字节,别处看到的一句话:如果一行中剩下的空间不足以填充某成员变量,则该成员变量在分配内存时会另起一行分配。 这里一行的空间就是对齐字节数

两种方式修改编译器默认对齐字节数:
1)如下
#pragma pack (16)
struct st_s{
char a;
int b;
};
#pragma pack ()
修改值a = 16;
默认值b = 结构体中占内存最大的字节长度,这里就是int类型的长度,就是4;
那么实际对齐值就是min(a, b),就是4,
所以结果sizeof(struct st_s) = 8;

2)
struct st_s{

    char a;
    int  b;

};
__attribute((aligned (16)));
修改值a = 16;
默认值b = 结构体中占内存最大的字节长度,这里就是int类型的长度,就是4;
和1)不同的是,这个时候的对齐值就不是最小值了,而是按照修改值;
所以实际对齐值就是16,按照第二步说的,如果一行中剩下的空间不足以填充某成员变量,则该成员变量在分配内存时会另起一行分配,在这个例子中,char a占4字节,b紧跟其后占4字节,不用换新行,一行就可以填充两个成员的内存;
所以结果sizeof(struct st_s) = 16;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值