ホームページ >バックエンド開発 >Golang >同じフィールドを持つ Go 構造体のサイズが異なるのはなぜですか?

同じフィールドを持つ Go 構造体のサイズが異なるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-18 16:18:10758ブラウズ

Why Do Go Structs with the Same Fields Have Different Sizes?

構造体フィールドの順序とサイズ

提供されたコードは興味深い動作を示しています:

<br>タイプAの構造体{</p>
<pre class="brush:php;toolbar:false">a bool
b int64
c int

}

type B struct {

b int64
a bool
c int

}

のサイズを印刷する場合A{} と B{} が unsafe.Sizeof を使用すると、驚くべき結果が得られますresults:

<br>fmt.Println(unsafe.Sizeof(A{})) // 出力: 24<br>fmt.Println(unsafe.Sizeof(B{})) / / 出力: 16<br>

なぜこれらを行うのか同じフィールドがあるにもかかわらず、構造体のサイズが異なりますか?

フィールドの配置

答えはフィールドの配置にあります。 Go では、変数のアドレスはその型に基づいて整列する必要があり、この整列は int64 (8 バイト整列) のような型の場合に特に重要です。 A の場合、最初のフィールド a はブール値であり、必要な記憶域は 1 バイトだけです。このフィールドの後には、次のフィールド b (int64 型) を 8 バイト境界に配置するための 7 バイトの暗黙的なパディングがあります。ただし、B の場合、最初のフィールド b はすでに 8 バイト境界に位置合わせされているため、暗黙的なパディングの必要がなく、その結果、構造体のサイズは 16 バイトと小さくなります。 h3>空の構造体のサイズ

次に進むと、別の興味深いことに遭遇しますcase:

</p>type C struct {<p>}<br>


unsafe.Sizeof(C{}) を出力すると、予期せず出力 0 を取得します。すべての構造体が何らかの値を占有している場合、これはどのようにして可能ですか? Memory?

ゼロ サイズの値

Go の仕様では、サイズがゼロより大きいフィールドや要素を持たない構造体または配列のサイズは次のようになります。ゼロ。また、2 つの異なるサイズ 0 変数が同じメモリ アドレスを共有する可能性があることも意味します。これは C{} の場合に当てはまります。C{} のサイズはゼロであり、実際のメモリを占有しない可能性があります。代わりに、struct{}{}、[]int{}、または空の配列 [3]struct{}{} など、他のサイズ 0 の値と同じメモリ アドレスを参照できます。

結論

フィールドのアライメントとゼロサイズ値の概念を理解すると、Go のメモリ管理の理解が深まります。構造体内でフィールドを戦略的に配置することで、メモリ割り当てを最適化し、効率的なデータ操作を確保できます。

以上が同じフィールドを持つ Go 構造体のサイズが異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。