ビット フィールドを持つ構造体がある場合、後続のメンバーは構造体でどのように配置されるのでしょうか? 次のコードを検討してください。
struct A{
int a:1;
char b; // at offset 1
};
struct B{
int a:16;
int b: 17;
char c; // at offset 7
};
printf("Size of A: %d\n", (int)sizeof(struct A));
printf("Offset of b in A: %d\n", (int)offsetof(struct A, b));
printf("Size of B: %d\n", (int)sizeof(struct B));
printf("Offset of c in B: %d\n", (int)offsetof(struct B, c));
出力:
Size of A: 4
Offset of b in A: 1
Size of B: 8
Offset of c in B: 7
ここで、最初のケースでb
は、パディングなしで構造体の 2 番目のバイトに割り当てられます。ただし、2 番目のケースでは、ビット フィールドが 4 バイトオーバーフローc
すると、最後の (8 番目の) バイトに割り当てられます。
2番目のケースでは何が起こっていますか?一般に、ビットフィールドを含む構造体のパディングのルールは何ですか?