结构体大小与字节对齐

1.明确一个宏定义

#pragma pack(n)  n=1, 2, 4, 8, 16, 32, ....

该宏是用来设置对齐模数,当不写入n,#pragma pack()这种情况是设置为默认字节模数

注:32位系统默认字节模数是4,64位系统默认字节模数是8

2.成员字节偏移

在结构体每个成员变量字节偏移的计算中,取对齐模数变量本身大小小的那个

例:

①将字节模数设置为4

注:因为对齐模数[4] < 本身字节数[8],所以取4

前两个变量大小为:1+(3)+8

②将字节模数设置为16

注:因为对齐模数[16] > 本身字节数[8],所以取8

前两个变量大小为:1+(7)+8

 

3.结构体偏移

计算最终结构体大小偏移时,取对齐模数结构体中最大成员变量大小小的那个,最终结构体大小应该是那个小的数的倍数

例如:

①对齐模数设置为4

注:因为对齐模数[4] < 最大成员大小(double)[8],所以取4

理论大小=1+(3)+8+2=14,不是4的倍数,所以实际大小=1+(3)+8+2+(2)=16

②对齐模数设置为16

注:因为对齐模数[16] < 最大成员大小(double)[8],所以取8

理论大小=1+(7)+8+2=18,不是8的倍数,所以实际大小=1+(7)+8+2+(6)=24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值