提供されたコードは興味深い動作を示しています:
<br>タイプAの構造体{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><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>
Go の仕様では、サイズがゼロより大きいフィールドや要素を持たない構造体または配列のサイズは次のようになります。ゼロ。また、2 つの異なるサイズ 0 変数が同じメモリ アドレスを共有する可能性があることも意味します。これは C{} の場合に当てはまります。C{} のサイズはゼロであり、実際のメモリを占有しない可能性があります。代わりに、struct{}{}、[]int{}、または空の配列 [3]struct{}{} など、他のサイズ 0 の値と同じメモリ アドレスを参照できます。
フィールドのアライメントとゼロサイズ値の概念を理解すると、Go のメモリ管理の理解が深まります。構造体内でフィールドを戦略的に配置することで、メモリ割り当てを最適化し、効率的なデータ操作を確保できます。
以上が同じフィールドを持つ Go 構造体のサイズが異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。