Solaris 動的トレースガイド

ビットフィールド

D では、任意のビット数の整数の構造体メンバーまたは共用体メンバーも定義できます。これを「ビットフィールド」と呼びます。ビットフィールドを宣言するときは、次の例のように、符号付きまたは符号なしの整数基本型、メンバー名、およびフィールドに割り当てるビット数を示す接尾辞を指定します。

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

ビットフィールド幅は、メンバー名の後ろのコロンに続く整数定数で表されます。ビットフィールド幅は必ず正の数で、対応する整数基本型の幅を超えない範囲のビット数とします。D では、64 ビットを超えるビットフィールドは宣言できません。D のビットフィールドは、対応する ANSI-C の機能と互換性があり、ANSI-C の機能にアクセスできます。通常、ビットフィールドは、メモリー記憶域が不足している場合や、構造体レイアウトをハードウェアレジスタレイアウトと一致させる必要がある場合に使用します。

ビットフィールドは、整数やマスクセットのレイアウトを自動化し、メンバー値を抽出するコンパイラ構成です。マスクをユーザー定義し、演算子 & を使用しても、同じ結果が得られます。C と D のコンパイラは、できるだけ効率よくビットを詰めようとしますが、処理の順序や方法は特に指定されていません。そのため、使用するコンパイラやアーキテクチャが異なる場合は、ビットフィールドを指定しても、同一のビットレイアウトが得られるとはかぎりません。安定したビットレイアウトが必要な場合は、ビットマスクを作成し、演算子 & を使って値を抽出してください。

ビットフィールドメンバーにアクセスするときは、構造体や共用体のメンバーにアクセスするときと同じく、その名前と演算子「.」または「->」を指定します。ビットフィールドは、どの式でも使用できるようにするため、自動的に 2 番目に大きい整数型に拡張されます。ビットフィールド記憶域はバイト境界上には配置できません。また、そのサイズは、バイト数の概数であってはなりません。したがって、ビットフィールドメンバーには、演算子 sizeofoffsetof を適用することはできません。D コンパイラでは、演算子 & を使ってビットフィールドメンバーのアドレスを指定することも禁じられています。