如果我們有位域的結構,那麼後續成員如何在結構中對齊?請看下面的代碼:具有位域的結構中的偏移量
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
只是在結構中沒有任何填充第二字節分配。但是,在第二種情況下,當位字段溢出4個字節時,c
被分配在最後的(第8個)字節中。
第二種情況發生了什麼?一般來說,涉及位域的結構中的填充規則是什麼?
一般的規則是:編譯器可以墊和對齊的東西在它想要的任何方式。所有編譯器都提供了實現定義的擴展來控制字段的打包方式,如果您關心它們,您應該使用它們。 – DanielKO
[位域的類型是否影響結構對齊]的可能的重複,並且還讀取[this]( http://stackoverflow.com/questions/6043483/why-bit-endianness-is-an-issue-in-bitfields/6044223#6044223)。 – Lundin