C++中struct的字节对齐

本文详细解析了C++结构体中不同数据类型在内存中的对齐方式及其变化,通过实例展示了如何使用编译指令来调整数据的对齐策略,以及这对程序性能可能产生的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct tagSTRUCT {
	char c;
	short s;
	int i;
	long l;
} ST;
cout << sizeof(ST) << endl;
变量名字节数起始地址结束地址
c100
s223
i447
l8815

sizeof(ST)的值为16,重点是short类型的s,它占2个字节,它只能从2的倍数的地址开始,所以它跳过了1地址,由2地址开始。


struct tagSTRUCT {
	char c;
	long l;
	short s;
	int i;
} ST;
变量名字节数起始地址结束地址
c100
l8815
s21617
i42023

sizeof(ST)的值为24,这次long类型的s提到了第二,占8字节(这里定义为8字节),也就是说它只能从8的倍数的地址开始,所以它跳过了1地址,由8开始;然后short类型的s,刚好到它就是16地址,不用跳直接就在那里开始,占16、17地址;然后是int型的i,它只能从4的倍数的地址开始,16已经过了,只能从20开始,到23共4个字节。


如果上面的加入编译指令#pragma pack(4)呢?就会变成:

变量名字节数起始地址结束地址
c100
l8411
s21213
i41619
sizeof(ST)的值为20,这里得看l,原本它要从8的倍数的地址开始的,但因为编译指令,它从4开始。上述编译指令的作用就是数据类型要求的对齐值大于等于pack(n)中的n时,按n的倍数对齐,n只能取1、2、4、8、16。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值