字节对齐
字节对齐就是数据在内存中的位置。
假设一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比方在32位cpu下。假设一个整型变量的地址为0x00000004,那它就是自然对齐的。
字节对齐的必要性
须要字节对齐的根本原因在于CPU訪问数据的效率问题。假如整型变量的地址不是自然对齐。比方为0x00000002,则CPU假设取它的值的话须要訪问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据。假设变量在0x00000003地址上的话则要訪问三次内存,第一次为char,第二次为short,第三次为char,然后组合得到整型数据。
而假设变量在自然对齐位置上,则仅仅要一次就能够取出数据。
字节对齐的规则
对于标准数据类型,它的地址仅仅要是它的长度的整数倍即可了。而非标准数据类型按以下的原则对齐:
1. 数组 :依照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。
2. 联合 :按其包括的长度最大的数据类型对齐。
3. 结构体: 结构体中每一个数据类型都要对齐。
样例
struct stu{
char sex;
int length;
char name[10];
};
这个里面sex是1个字节,然后遇到length的时候,须要在sex后加入3个空字节,由于length占4个字节,而在name占10个字节之后,变为18个字节,并不正确齐,所以添两个空字节。变为20个字节。
改变对齐方法
__attribute__
选项
这个是改变对齐方法的,例如以下样例:
struct stu{
char sex;
int length;
char name[10];
}__attribute__ ((aligned (1)));
这个是一共变成了15个字节,由于aligned
改变了自然对齐字节为1个字节。
所以总体缩小了。
相同以下的声明:
struct stu{
char sex;
int length;
char name[10];
}__attribute__ ((packed));
这个也是15个字节。packed
让结构体使用最小的对齐方式。
必须声明对齐
在设计不同CPU的通信协议时。或者编写硬件驱动程序时寄存器的结构这两个地方都须要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.