Solaris 动态跟踪指南

位字段

D 还允许定义任意位数的整型结构和联合成员(称作位字段)。通过指定带符号整数或无符号整数的基本类型、成员名以及指示要为字段分配的位数的后缀,可以声明位字段,如以下示例所示:

struct s {
	int a : 1;
	int b : 3;
	int c : 12;
};

位字段宽度是一个整型常数,通过结尾冒号与成员名分隔。位字段宽度必须为正数,并且其位数不得超过对应的整数基本类型的宽度。在 D 中,无法声明 64 位以上的位字段。D 位字段与对应的 ANSI-C 功能兼容,并提供对相应 ANSI-C 功能的访问。位字段通常用于非常需要内存存储空间,或结构布局必须与硬件寄存器布局匹配的情况。

位字段是一种编译器构造,该构造可自动设置整数布局和一组掩码,以提取成员值。您只需自己定义掩码并使用 & 运算符,即可获取同样的结果。C 编译器和 D 编译器将尽可能对位进行有效打包,但是,由于它们会按照所需顺序或方式随意打包,因此,无法保证位字段在不同编译器或体系结构间生成相同的位布局。如果您需要稳定的位布局,则应使用 & 运算符,亲自构造位掩码并提取值。

与任何其他结构或结构成员一样,只需指定位字段成员名并结合 "." 或 -> 运算符,便可访问位字段成员。位字段将自动提升为下一个最大的整数类型,以供所有表达式使用。由于位字段存储不能在字节边界上对齐,或大小不能为字节约数,因此,无法将 sizeofoffsetof 运算符应用于位字段成员。另外,D 编译器还禁止您使用 & 运算符获取位字段成员的地址。