结构体字节对齐小结

结构体字节对齐小结

1.字节对齐的原因
    一些平台对某些特定类型的数据,只能从特定地址开始存取。如有些存取是从偶地址开始,假设int(32位)的数据存在偶地址开始,则只需要一个周期就能拿到。但如果在奇地址开始,则除了要用2个周期读取外,还要对高低地址进行拼凑才能得到正确的数据。显然这是低效的。

2.一般编译器在编译程序时所遵循的三个原则(重要)
    1)结构体变量的首地址能够被其最宽的基本类型成员的大小所整除
    2)结构体每个成员相对于结构体首地址的偏移量是该成员大小的整数倍,必要时在成员之间加上填充值
    3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,必要时在最后一个成员后加上填充字节

3.在编程中考虑字节对齐
    1)为了节省空间,基本原则是把结构中的变量按照类型大小由小到大声明,尽量减少中间的填补空间。
    2)显式的进行填补空间,即在成员中插入char reserved[N]的方法占用空间,N的值为希望填补的大小。

eg:
假设sizeof(int) = 4; sizeof(short) = 2;
1.
struct A
{
    char a;
    int b;
    short c;
}
sizeof(A) = sizeof(a)+3+sizeof(b)+sizeof(c)+2=12
加3是因为上述2.2原因
加2是因为上述2.3原因
2.
struct B
{
    char a;
    short c;
    int b;
}
sizeof(B) = sizeof(a)+1+sizeof(c)+sizeof(b)=8;
加1是因为上述2.2原因
最后什么都没加是因为上述2.3原因
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值