结构体字节对齐的规则

字节对齐的计算规则
1、先看结构中最大类型的数据,包括嵌套结构体(如果有)。确定一行的最大数。
2、如果只有一个元素,那就是这个元素的大小,不需要补齐。
3、单一变量,先看看元素放到这一排的剩余位置能否完全放下,如果放不下,则从下一行的首地址开始放。
4、嵌套子结构体则要看看这个元素的整个大小(就是累加的大小,不是对齐的大小)放到这一排的剩余位置能不能放下,放不下则从下一行开始,子结构体中的元素排列规则和单一变量相同)
用在线的编译器: http://www.shucunwang.com/RunCode/c/

char(1),short(2),int(4),float(4),double(8),long(4)

例1

struct {

int a; //第一行,最大元素,所以每行有4个字节

short b; //第二行首位,第二行还有两个2字节的剩余空间

char c1; //第二行

char c2; //第二行

} a1; //大小为8

空间分布(8个字节)

aaaa
bbc1c2

例2

struct A{ char e; short f; int g;};

typedefstruct B{ int a; char b; struct A c; char d;}B;

空间分布(20个字节)

aaaa
bxxx
effx
gggg
dxxx

例3

struct A{ char e; short f; double g;};

typedefstruct B{ int a; char b; struct A c; char d;}B;

空间分布(32字节)

aaaabxxx
effxxxxx
gggggggg
dddddddd


结论:

只有一个元素:那就是这个元素的大小

多于两个元素:先看所有元素中最大的是多少,确定一行到底有多少字节,

看每一个元素能不能这一行完全放下(子结构体要看整个的大小),

放不下,另起一行开始放。最后一个元素再填充补齐这一行


指定字节对齐

#pragma pack(xx) //xx必须是2的n次方

#pragma pack(1) //1字节对齐

#pragma pack(2) //2字节对齐

#pragma pack(4) //4字节对齐

#pragma pack(8) //8字节对齐

#pragma pack(16) //16字节对齐


参考文献

http://blog.csdn.net/tennysonsky/article/details/51355690


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值