考虑:
struct mystruct_A { char a; int b; char c; } x; struct mystruct_B { int b; char a; } y;
结构的大小分别为 12 和 8。 这些结构是填充的还是包装好的?
何时进行填充或包装?
填充 将结构成员与“自然”地址边界对齐int- 例如,成员将具有偏移量,这些偏移量mod(4) == 0位于 32 位平台上。默认情况下填充是打开的。它将以下“间隙”插入到您的第一个结构中:
int
mod(4) == 0
struct mystruct_A { char a; char gap_0[3]; /* inserted by compiler: for alignment of b */ int b; char c; char gap_1[3]; /* -"-: for alignment of the whole struct in an array */ } x;
另一方面,Packing__attribute__((__packed__))会阻止编译器进行填充 - 这必须明确要求 - 在 GCC 下它是,所以如下:
__attribute__((__packed__))
struct __attribute__((__packed__)) mystruct_A { char a; int b; char c; };
将6在 32 位架构上生成大小结构。
6
不过需要注意的是 - 在允许它的架构(如 x86 和 amd64)上,未对齐的内存访问速度较慢,并且在SPARC等严格对齐的架构上被明确禁止。