[解決済み] 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 には次のように書かれています: "ユニット内のビットフィールドの割り当て順序 (高次から低次または低次から高次) は実装で定義されています;
単一のコンパイラーであっても、たとえばターゲット プラットフォームのエンディアンによって、ビット フィールドを異なるようにレイアウトすることがあります。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】'cout'は型名ではない
-
[解決済み】C++の余分な資格エラー
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】ビットシフト(bit-shift)演算子とは、どのようなもので、どのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】システムが指定されたファイルを見つけられませんでした。