Go では、フィールドが異なる順序で配置されている場合、構造体のサイズが異なることがあります。
type A struct {<pre class="brush:php;toolbar:false">a bool b int64 c int
}
type B struct {
b int64 a bool c int
}
安全でない実行時。 Sizeof(A{})、結果は 24 バイトですが、unsafe.Sizeof(B{}) 16バイトを出力します。同じフィールドのセットがあるにもかかわらず、順序が異なるため、このサイズの変動が生じます。
構造体のサイズは、アライメント制約の影響を受けます。 int64 値には、8 バイトのアドレスでのアラインメントが必要です。構造体 A では、bool フィールド (1 バイト) の後に、次の int64 フィールド (8 バイト) の位置合わせを保証するために 7 バイトの暗黙的なパディングが追加されます。これは 24 バイトのサイズを説明しています。
ただし、構造体 B では、int フィールドが 4 バイトのみであるため、bool フィールドの後に必要なパディングは 3 バイトだけです。したがって、全体のサイズは 16 バイトになります。
type C struct {<br>}<br>
構造体 C には、これより大きいサイズのフィールドがないため、サイズは 0 です。 ゼロ。ただし、これは必ずしも C 型のインスタンスにメモリが割り当てられていないことを意味するわけではありません。
Go 仕様によれば、サイズ 0 の値はメモリ アドレスを共有することがあります。仕様では同じアドレスを使用することが推奨されていますが、これは必須ではありません。現在の Go 実装は、この最適化を利用して、サイズがゼロの変数のメモリを節約します。したがって、C のサイズがゼロであるにもかかわらず、システムは C 型の変数にメモリを割り当てる可能性があります。
以上がGo 構造体のサイズがフィールドの順序に応じて異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。