11

C/C++ ビットフィールドは、ハードウェア ドライバーやバイナリ ネットワーク転送に多くの用途があるようです。ただし、C99 標準 6.7.2.1/10 からのこの引用に見られるように、実際のバイナリ レイアウトは実装固有であるため、これらは広く使用されていないようであり、一般的に推奨されていません。

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

私の質問はかなり単純です。なぜ委員会は、ビットフィールドを実装固有のものとして残し、それによって主にメモリ使用量を削減するために使用できるコンパイラ構造にすることを決定したのですか?少しいじるコードからの開発者?

4

1 に答える 1

8

同じ理由で、他の多くのことが標準で厳密に指定されていません: 多数のプラットフォームとシステムに準拠したコンパイラを柔軟に作成できるようにし、それでも効率的なコンパイラを使用できるようにするためです。

特に、ビットフィールドを特定のビット/バイト順で格納する必要があると、本来のバイト順が「間違った方法」であるマシンでは非常に遅くなります。

はい、それは、ビットフィールドを複数のアーキテクチャとプラットフォーム間で移植可能にすることは、背後にある正当な苦痛であることを意味します。本当にそれが必要な場合は、おそらく他の解決策を検討する必要があります...

于 2013-07-18T12:48:03.140 に答える