位域對齊
位域提供了宣告小於字元寬度的結構欄位的能力。位欄位使用位元組級或字級掩碼實現。以下示例導致 8 位元組的結構。
struct C
{
short s; /* 2 bytes */
char c; /* 1 byte */
int bit1 : 1; /* 1 bit */
int nib : 4; /* 4 bits padded up to boundary of 8 bits. Thus 3 bits are padded */
int sept : 7; /* 7 Bits septet, padded up to boundary of 32 bits. */
};
註釋描述了一種可能的佈局,但由於標準說未指定可定址儲存單元的對齊,因此其他佈局也是可能的。
未命名的位欄位可以是任何大小,但不能初始化或引用它們。
零寬度位欄位不能賦予名稱,並將下一個欄位與由位欄位的資料型別定義的邊界對齊。這是通過填充位域之間的位來實現的。
結構’A’的大小是 1 個位元組。
struct A
{
unsigned char c1 : 3;
unsigned char c2 : 4;
unsigned char c3 : 1;
};
在結構 B 中,第一個未命名的位欄位跳過 2 位; c2
之後的零寬度位欄位使得 c3
從 char 邊界開始(因此在 c2
和 c3
之間跳過 3 位。在 c4
之後有 3 個填充位。因此結構的大小是 2 個位元組。
struct B
{
unsigned char c1 : 1;
unsigned char : 2; /* Skips 2 bits in the layout */
unsigned char c2 : 2;
unsigned char : 0; /* Causes padding up to next container boundary */
unsigned char c3 : 4;
unsigned char c4 : 1;
};