質問:
C 構造体の読み取り/書き込みを安全に行うことは可能ですか?クロスプラットフォームとコンパイラを保証する方法で C 構造体をファイルに変換する互換性はありますか?
答え:
いいえ、C にはバイナリレベルの標準化がないため不可能です。
Don Box 氏によると, C にはバイナリ レベルでの標準化が欠けており、コンパイラによって構造体のパディングが異なる方法で実装される可能性があります。同じコンパイラ内であっても、構造体のパッキング アライメントは、使用されるプラグマ パックに応じて異なる場合があります。
さらに、構造体内のメンバーの順序は、そのサイズに影響を与える可能性があります。たとえば、同じメンバーを持つ構造体の宣言順序が異なると、サイズが異なる場合があります。
例:
struct A { char c; char d; int i; }; struct B { char c; int i; char d; };
上記のコードを gcc-4.3.4 でコンパイルすると、次のようになります。 :
8 12
これは、両方の構造体が同じメンバーを持っているにもかかわらず、そのサイズが異なることを示しています。
結論:
標準ではパディングをどのように実装するかは規定されておらず、コンパイラの裁量に委ねられています。その結果、すべてのコンパイラーが同じパディング ルールを適用すると想定することは不可能であり、クロスプラットフォーム互換性の実現が困難になります。
以上がC 構造体は、プラットフォームやコンパイラー間で安全に読み書きできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。