结构体字节对齐小结

来源:互联网 发布:windows 手写笔记软件 编辑:程序博客网 时间:2024/05/02 04:05

结构体字节对齐小结

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原因