字节对齐

字节对齐是指变量在内存中按照一定规则排列。

不同CPU由于数据总线的位数不同,每次操作只能读取特定的长度。比如一个32位机要读取地址在0x2000 0004的int型变量,只需要一次操作就可以,但是如果这个变量在0x2000 0002,则需要先读取0x2000 0002 到0x2000 0003,再读取0x2000 0004 到 0x2000 0005,需要两次操作。所以编译器会对变量的排列进行对齐,填充部分内存来减少读取的次数,用空间换取运行效率。 例如:

struct {
    int a;
    char b;
    int c;
} test;

sizeof(test)应当为12,这是因为编译器填充了b后面的三个字节,保证了c的字节对齐。

但是有些时候节约空间比提高运行效率更重要,所以编译器提供了__packed宏来关闭字节对齐 例如:

struct __packed {
    int a;
    char b;
    int c;
} test; 或者

struct  __attribute__((packed)) {
    int a;
    char b;
    int c;
} test;

sizeof(test)应为9