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