位域對齊

位域提供了宣告小於字元寬度的結構欄位的能力。位欄位使用位元組級或字級掩碼實現。以下示例導致 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 邊界開始(因此在 c2c3 之間跳過 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;
};