在 Intel 处理器上,32 位对齐数据的获取比未对齐数据快得多;在许多其他处理器上,未对齐的提取可能完全是非法的,或者需要使用 2 条指令进行模拟。因此,第一个结构将c
始终在这些 32 位架构上与可被 4 整除的字节地址对齐。然而,这需要在存储中浪费 2 个字节。
struct s1 {
void *a;
char b[2];
int c;
};
// Byte layout in memory (32-bit little-endian):
// | a0 | a1 | a2 | a3 | b0 | b1 | NA | NA | c0 | c1 | c2 | c3 |
// addresses increasing ====>
另一方面,有时您绝对需要将一些未对齐的数据结构(如文件格式或网络数据包)按原样映射到 C 结构中;在那里你可以使用__attribute__((packed))
来指定你想要没有填充字节的所有内容:
struct s2 {
void *a;
char b[2];
int c;
} __attribute__((packed));
// Byte layout in memory (32-bit little-endian):
// | a0 | a1 | a2 | a3 | b0 | b1 | c0 | c1 | c2 | c3 |
// addresses increasing ====>