2

重複の可能性:
構造体の sizeof が各メンバーの sizeof の合計と等しくないのはなぜですか?
構造体のメンバーを uint32_t として宣言するときの余分なバイト

何らかの理由で、sizeof演算子はこの構造体に対して偽のサイズを返します (48ではなく40):

typedef struct mbdb_file_info {
  uint16_t mode;

  uint32_t unk0;
  uint32_t unk1;
  uint32_t user_id;
  uint32_t group_id;

  uint32_t time0;
  uint32_t time1;
  uint32_t time2;

  uint64_t length;
  uint8_t flag;
  uint8_t property_count;
} mbdb_file_info;

だからここに簡単なテストがあります:

printf("%ld %ld %ld %ld: %ld", sizeof(uint8_t),
                                sizeof(uint16_t), 
                                sizeof(uint32_t),
                                sizeof(uint64_t),
                                sizeof(mbdb_file_info));

どちらが印刷されますか:

1 2 4 8:48

これはどのように起こりますか?すべてのサイズを合計すると40、 ではなくになり48ます。は一体どこ48から来るのでしょうか?

そして、それが奇妙なx86-64特典である場合、構造体のすべてのフィールドが占有したい量を確実に占有するようにするにはどうすればよいですか (この構造体に大量のバイトをキャストしています)。

4

5 に答える 5

5

コンパイラは、構造体メンバーを整列させるために、構造体の途中にいくつかのバイトを追加する場合があります。構造体のサイズは、少なくともメンバーのサイズの合計ですが、これに限定されません。

于 2011-12-01T20:10:25.317 に答える
3

構造体メンバーの順序を変更することで、パディングを取り除くこともできます。たとえば、64 ビット、次に 32 ビット、次に 16 ビット、次に 8 ビットを宣言すると、自然にアラインされ、余分なパディング バイトはありません。

于 2011-12-01T20:16:32.920 に答える
1

構造パディングのため(ここではどちらの用語かわかりません)。最大のフィールドは 64 ビットなので、すべてがそれに合わせて調整されます。したがって、次のようになります。

typedef struct mbdb_file_info {
  uint16_t mode; // 16 + 

  uint32_t unk0; // 32 = 48, so add 16 more to align to 64bit;
  uint32_t unk1; // this
  uint32_t user_id; // and this give 64bits ;
  uint32_t group_id; // again this

  uint32_t time0; // plus this - 64bits;
  uint32_t time1; // this 
  uint32_t time2; // and this = 64bit ;

  uint64_t length; // this is 64 by itself
  uint8_t flag;  // this
  uint8_t property_count; // +this is 16, add 48 for the alignment
} mbdb_file_info; // when you sum all bits (+ the additional for padding)
                      // you have exactly 48B
于 2011-12-01T20:15:37.523 に答える
0

アライメント。アーキテクチャによっては、特定のデータ型が特定の境界 (読み取り: 2 の因数で割り切れるアドレス、たとえば 16) で整列され、これにより構造内でパディングが発生します。

この動作を抑制するコンパイラ オプションがあり、gcc のドキュメントにはaligned属性の使用方法が記載されています。

于 2011-12-01T20:10:45.903 に答える
0

これは、配置のための構造パディングと呼ばれます。

起こりそうなことは、8 ビットと 16 ビットの値が 32 ビットにパディングされ、構造全体がマシン ワード サイズ (8) の倍数になるようにパディングされることです。

于 2011-12-01T20:11:25.613 に答える