2011-07-23 6 views
3

最初のケースではなぜ12でないのですか? gccと打ち鳴らすの最新版、64ビットのLinux構造体のメモリサイズは異なりますか?

struct desc 
{ 
    int** parts; 
    int nr; 
}; 

sizeof(desc); Output: 16

struct desc 
{ 
    int** parts; 
}; 

sizeof(desc); Output: 8

struct desc 
{ 
    int nr; 
}; 

sizeof(desc); Output: 4

答えて

7

コンパイラは、構造体の間にパディングを追加するために許可されている:でテスト メンバーより効率的に処理できます。このパディングは、プラットフォーム、コンパイラのバージョンなどによって異なります。ネットワーク経由でのstructsの送信を不可能にするものの1つです。

offsetofを使用すると、正確にコンパイラがパディングを追加する場所を知ることができます。

+3

不可能ではありません:これは、パッキングのために設計されたものです。 –

+0

64ビット→8バイト→4バイトから8バイトに変更 - > 16 –

+3

C標準では不可能です。 C標準にはstruct/pragmaパッキングは含まれていません – user411313

1

上記の回答が示すように、コンパイラはパディングを追加することができます。これは通常、特定のデータ型が特定のメモリ境界で発生する必要があることがハードウェアによって要求されるために行われます。あなたのシステムはポインタを8バイトの境界に置く必要があるようです。

パディングは構造体の最後にあり、構造体descの配列内の各要素は8バイト境界になるようにする必要があります。

関連する問題