概要: 構造体のフィールドの順序に応じて、異なる暗黙的なパディングが追加され、そのサイズに影響します。
アーキテクチャが異なると、メモリの配置も異なります。アドレス。たとえば、提供されているコードでは、ターゲット アーキテクチャが 386 で、alignof int64 が 8 バイトであると想定されています。
構造体 A では、最初のフィールドが bool であるため、7 バイトの暗黙的なパディングがあります。 A.a の後に、int64 型の A.b が 8 バイトで整列されたアドレスで始まるようにします。このパディングは、構造体自体が 8 バイトにアライメントされているため必要です。
ただし、構造体 B では、B.a の後に int 型のフィールドが続くため、暗黙的なパディングは 3 バイトのみです。サイズは 4 バイト)、int64 ではありません。
Go の仕様では、サイズがゼロより大きいフィールドや要素が含まれていない場合、構造体または配列型のサイズはゼロであると規定されています。
これは、明確なゼロを意味します。サイズ変数はメモリ内で同じアドレスを持つ場合があります。現在の実装はこのルールに従っているため、空の struct struct{} や長さ 0 の配列など、サイズが 0 の型の値にはメモリが割り当てられません。
たとえば、提供されているコードでは、C は次のようになります。サイズゼロの構造体。その結果、C のインスタンスにはメモリが割り当てられません。
以上がGo 構造体のフィールドの順序が異なるとサイズが異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。