我认为这行得通的原因是结构中的所有字段都是对齐的字符。如果至少有一个字段不对齐 1,则结构/类的对齐方式不会为 1(对齐方式将取决于字段顺序和对齐方式)。
让我们看一些例子:
#include <stdio.h>
#include <stddef.h>
typedef struct {
unsigned char a;
unsigned char b;
unsigned char c;
} Foo;
typedef struct {
unsigned short i;
unsigned char a;
unsigned char b;
unsigned char c;
} Bar;
typedef struct { Foo F[5]; } F_B;
typedef struct { Bar B[5]; } B_F;
#define ALIGNMENT_OF(t) offsetof( struct { char x; t test; }, test )
int main(void) {
printf("Foo:: Size: %d; Alignment: %d\n", sizeof(Foo), ALIGNMENT_OF(Foo));
printf("Bar:: Size: %d; Alignment: %d\n", sizeof(Bar), ALIGNMENT_OF(Bar));
printf("F_B:: Size: %d; Alignment: %d\n", sizeof(F_B), ALIGNMENT_OF(F_B));
printf("B_F:: Size: %d; Alignment: %d\n", sizeof(B_F), ALIGNMENT_OF(B_F));
}
执行时,结果为:
Foo:: Size: 3; Alignment: 1
Bar:: Size: 6; Alignment: 2
F_B:: Size: 15; Alignment: 1
B_F:: Size: 30; Alignment: 2
您可以看到 Bar 和 F_B 的对齐方式为 2,因此其字段 i 将正确对齐。您还可以看到 Size of Bar 是6 而不是 5。同样, B_F (Bar 的 5)的大小是30 而不是 25。
所以,如果你是硬代码而不是sizeof(...)
,你会在这里遇到问题。
希望这可以帮助。