クロスプラットフォームのビット フィールドの順序と配置: 誤解
構造内のビット フィールドの順序はプラットフォーム固有のように見えるかもしれませんが、プラットフォーム固有のコンパイラ パッキング オプションが一貫したデータ ストレージを保証できるかどうかという疑問は残ります。
次のことを検討してください。シナリオ:
struct Message { unsigned int version : 3; unsigned int type : 1; unsigned int id : 5; unsigned int data : 6; } __attribute__ ((__packed__));
GCC を搭載した Intel プロセッサでは、フィールドは最初にバージョン、次にタイプというようにメモリ内に配置されます。
ただし、クロスプラットフォームの移植性はまだわかりません。 。パッキング オプションはコンパイラの拡張機能であり、完全には移植可能ではありません。さらに、C99 §6.7.2.1、段落 10 では、ビット フィールドの割り当て順序 (上位から下位、またはその逆) は実装定義であると明示的に述べられています。
同じコンパイラであっても、異なるビット フィールドを示す可能性があります。レイアウトはターゲット プラットフォームのエンディアンに応じて異なります。したがって、コンパイラ固有のパッキング オプションに依存して、クロスプラットフォームのデータの順序と位置合わせを保証することは、信頼できるアプローチではありません。
以上がコンパイラのパッキングは、クロスプラットフォームのビット フィールドの順序とアライメントを保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。