3

パッキング コンパイラ オプションまたはプラグマを使用しない限り、次のようなコードを作成します (8 ビットの char と 16 ビットの short を想定)。

struct foo
{
   short a ;
   char  b ;
   short c ;
} ;

私の知る限りでは、c私たちの製品がサポートするすべてのプラットフォーム (かなりの数) で 1 バイトのアラインメント パッドになります。

bと の間にアラインメント パディングを配置しなかったプラットフォームを見た記憶はありませんがc、コンパイラが と の間にパディングを合法的に配置できると想像してみてaくださいb

(動機: 現在ディスクに書き出されている、またはネットワーク フローに関与している構造のバイナリ互換性を確保するために、コードにインフラストラクチャを導入しています。可能な場合は、明示的なパディングを挿入して、他の開発者が追加のストレージはこれらのデータ構造によって隠れて消費されています)。

必要に応じて、そうでなければ整列されないメンバーの直前に、コンパイラが整列パディングを配置しないプラットフォームを知っている人はいますか?

4

1 に答える 1

3

私が知っている場所ではデフォルトではありませんが、#pragma pack構造体のパッキングを制御し、ミスアライン アクセスを許可する MSVC (および互換性のために gcc がサポートされていると思います) がサポートされています。

基本的に、C 構造体のバイト レイアウトの仮定は、問題を引き起こしているだけです。これを行うコードは、一般的なプラットフォーム間で完全に互換性のない単語のエンディアンについて仮定するという罠に陥る傾向があります。

于 2012-09-07T17:29:34.800 に答える