这篇文章讲的非常清晰:http://www.linuxsong.org/2010/09/c-byte-alignment
总结一下:
(1)每个结构体成员都有一个有效对齐值N,如果对结构体事先指定了有效对齐值,则N不得超过指定的值(如int自身有效对齐值是4,char是1,若在外部指定有效对齐值为2,则int有效对齐值变为2,char仍是1)。
(2)每个结构体成员的起始地址均为其有效对齐值N的整数倍,否则用空白填充且起始地址后移。
(3)整个结构体的有效对齐值是所有成员中有效对齐值的最大值,且整个结构体所占空间必须是结构体有效对齐值的整数倍。
(4)当结构体中的成员也为结构体时,将子结构体作为整体来看,其内存结构布局不变,如下例子:
struct A{ char a; short b; int c; }; struct B{ char a; struct A c; }; void main() { printf("%d ", sizeof(struct A)); printf("%d ", sizeof(struct B)); struct B f; printf("B: %p ", &f); printf("B.a: %p ", &f.a); printf("B.c: %p ", &f.c); printf("A.a: %p ", &f.c.a); printf("A.b: %p ", &f.c.b); printf("A.c: %p ", &f.c.c); }
输出结果:
8 12 B: 0xbeede6f4 B.a: 0xbeede6f4 B.c: 0xbeede6f8 A.a: 0xbeede6f8 A.b: 0xbeede6fa A.c: 0xbeede6fc