クロスプラットフォーム/コンパイラ互換の構造体をファイルに安全に読み書きできますか?
C の構造体にはクロスプラットフォームの課題があります。コンパイラ間のパディングの潜在的な違いによるプラットフォームの互換性。この不一致は、C がバイナリ レベルで標準化されていないことから生じます。
Don Box が著書『Essential COM』で説明しているように、C のバイナリ ランタイム モデルは標準化されていません。したがって、同じコンパイラを異なるプラグマ パック ディレクティブで使用している場合でも、異なるコンパイラは構造体に対してさまざまなパディング アラインメントを使用できます。
さらに、構造体内のメンバー宣言の順序は、メンバーが残っている場合でもそのサイズに影響を与える可能性があります。同一。例:
struct A { char c; char d; int i; }; struct B { char c; int i; char d; };
gcc-4.3.4 でコンパイルすると、メンバーが同一であるにもかかわらず、A と B のサイズが異なります。
Size of A: 8 Size of B: 12
この差により、すべてのサイズが異なると想定することができなくなります。コンパイラは同じ方法で構造体をパディングします。したがって、クロスプラットフォーム/コンパイラ互換の方法で構造体をファイルに安全に読み書きする保証された方法はありません。
以上が異なるプラットフォームやコンパイラー間で C 構造体を安全に保存および取得できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。