字节对齐详解的补充


字节对齐详解文章见http://blog.csdn.net/weixing979/archive/2006/05/12/725638.aspx

A结构体做为B结构体成员的情况
则计算A的长度和A的有效对齐值,然后进行填充计算


如下结构体

#pragma pack(8)
struct s1
{
short a;
long b;
};

struct s2
{
char c;
s1 d;
};

s1做为s2的成员,s1的长度为8,s1的有效对齐值为4( s1的自身对齐值为4(成员short与long中的自身对齐值的最大值)
s1的有效对齐值为 min(4,8) = 4)
所以s2 的长度为 1 + 3(填充) + 8 = 12


如果设定 #pragma pack(4)
s1长度为8
s1的有效对齐值为 min(4,4) = 4
s2 的长度为 1 + 3(填充) + 8 =12

如果设定 #pragma pack(2)
s1长度为6
s1的有效对齐值为min(4,2) = 2
s2的长度为 1 + 1(填充) + 6 = 8

再看下一个例子
#pragma pack(8)
struct s1
{
short a;
double b;
};

struct s2
{
char c;
s1 d;
};
此时 s1长度为16,s1的有效对齐值为min(8,8) = 8 (其中s1的自身对齐值为double长度8)
s2的长度为1+7(填充)+16 = 24

如果设定 #pragma pack(4)
s1长度为12,s1的有效对齐值为min(8,4) = 4
s2的长度为1+3(填充)+12= 16

如果设定 #pragma pack(2)
s1长度为10,s1的有效对齐值为min(8,2)= 2
s2的长度为1+1(填充)+10 = 12

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值