位域对齐

位域提供了声明小于字符宽度的结构字段的能力。位字段使用字节级或字级掩码实现。以下示例导致 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;
};