1. ホーム
  2. c++

[解決済み] C/C++: 強制ビットフィールドの順序とアライメント

2023-03-15 06:38:09

質問

構造体内のビットフィールドの順序はプラットフォーム固有であると読みました。 異なるコンパイラ固有のパッキング オプションを使用した場合、データが書かれたとおりに適切な順序で格納されることは保証されますか? たとえば

struct Message
{
  unsigned int version : 3;
  unsigned int type : 1;
  unsigned int id : 5;
  unsigned int data : 6;
} __attribute__ ((__packed__));

GCC コンパイラを搭載した Intel プロセッサ上では、フィールドは図のようにメモリ上にレイアウトされました。 Message.version はバッファの最初の 3 ビット、そして Message.type が続きます。さまざまなコンパイラで同等の構造体パッキング オプションを見つけたら、これはクロス プラットフォームになるのでしょうか?

どのように解決するのですか?

いいえ、完全にはポータブルにはなりません。 構造体のパッキング オプションは拡張機能であり、それ自体は完全に移植可能なものではありません。 それに加えて、C99 §6.7.2.1, paragraph 10 には次のように書かれています: "ユニット内のビットフィールドの割り当て順序 (高次から低次または低次から高次) は実装で定義されています;

単一のコンパイラーであっても、たとえばターゲット プラットフォームのエンディアンによって、ビット フィールドを異なるようにレイアウトすることがあります。