16

ビット構造体フィールドの最大ビット幅は?

struct i { long long i:127;}

ビットフィールドのサイズが最大 128 ビット、または 256 ビット、またはそれ以上で、構造体内にビットフィールドを定義できますか? sse2 (128 ビット)、avx1/avx2 (256 ビット)、avx-512 (次の Xeon Phis では 512 ビット) レジスタなど、いくつかの幅の広いベクトル タイプがあります。また、gccの__int128などの拡張機能もあります。

4

4 に答える 4

23

C99 §6.7.2.1、パラグラフ 3:

ビットフィールドの幅を指定する式は、コロンと式が省略された場合に指定された型のオブジェクトのビット数を超えない負でない値を持つ整数定数式でなければなりません。値がゼロの場合、宣言には宣言子がありません。

C++0xa §9.6、パラグラフ 1:

... 定数式は、ゼロ以上の値を持つ整数定数式でなければなりません。整数定数式の値は、ビットフィールドの型のオブジェクト表現 (3.9) のビット数よりも大きい場合があります。そのような場合、余分なビットはパディング ビットとして使用され、ビット フィールドの値表現 (3.9) には関与しません

So in C you can't do that at all, and in C++ it won't do what you want it to.

于 2010-04-15T19:52:13.777 に答える
3

C++ 標準では、ゼロ以上でなければならないことを除いて、ビットフィールドのサイズに制限はありません - セクション 9.6/1。また、次のようにも述べています。

ビットフィールドは、アドレス指定可能なアロケーション ユニットにパックされます。[注: ビットフィールドは、一部のマシンではアロケーション ユニットにまたがり、他のマシンではまたがりません。ビットフィールドは、一部のマシンでは右から左に割り当てられ、他のマシンでは左から右に割り当てられます。]

これは、ある種の最大サイズを示すために使用できると思います。

もちろん、これは、特定のコンパイラの実装が任意のサイズのビットフィールドをサポートするという意味ではありません。

于 2010-04-15T17:12:01.003 に答える
2

通常、基になる型よりも多くのビットを割り当てることはできません。long longが 64 ビットの場合、ビットフィールドはおそらく :64 に制限されています。

于 2010-04-15T17:14:34.277 に答える
1

ビットフィールドの値は整数に割り当てられるため、使用できる最大のビットフィールド値は intmax_t のサイズであると想定します。

編集:

C99仕様から:

6.7.2.1 箇条書き 9:

ビットフィールドは、指定されたビット数で構成される符号付きまたは符号なしの整数型として解釈されます。値 0 または 1 が _Bool 型の非ゼロ幅ビット フィールドに格納されている場合、ビット フィールドの値は、格納されている値と等しくなります。

6.7.2.1 箇条書き 10:

実装では、ビットフィールドを保持するのに十分な大きさのアドレス指定可能なストレージユニットを割り当てることができます。十分なスペースが残っている場合、構造内の別のビットフィールドの直後に続くビットフィールドは、同じユニットの隣接するビットにパックされます。十分なスペースが残っていない場合、収まらないビットフィールドを次のユニットに配置するか、隣接するユニットとオーバーラップするかは実装定義です。ユニット内のビットフィールドの割り当て順序 (上位から下位、または下位から上位) は実装定義です。アドレス可能なストレージ ユニットのアラインメントは指定されていません。

于 2010-04-15T17:16:28.213 に答える