これが機能する理由は、構造体のすべてのフィールドが 1 つに整列する char であるためだと思います。アラインメントが 1 でないフィールドが少なくとも 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 が適切に位置合わせされることがわかります。また、バーのサイズが5 ではなく 6であることもわかります。同様に、B_F (Bar の 5) のサイズは25 ではなく 30です。
したがって、 ではなくハードコードである場合、sizeof(...)
ここで問題が発生します。
お役に立てれば。