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

Go 構造体のサイズがフィールドの順序に応じて異なるのはなぜですか?

DDD
リリース: 2024-12-08 14:20:15
オリジナル
907 人が閲覧しました

Why Do Go Structs Have Different Sizes Depending on Field Order?

フィールドの並べ替えによる構造体のサイズの不一致

Go では、フィールドが異なる順序で配置されている場合、構造体のサイズが異なることがあります。

問題 1:誤った構造体サイズ

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 バイトになります。

問題 2: ゼロサイズの構造体 C

type C struct {<br>}<br>

構造体 C には、これより大きいサイズのフィールドがないため、サイズは 0 です。 ゼロ。ただし、これは必ずしも C 型のインスタンスにメモリが割り当てられていないことを意味するわけではありません。

説明: 実装の最適化

Go 仕様によれば、サイズ 0 の値はメモリ アドレスを共有することがあります。仕様では同じアドレスを使用することが推奨されていますが、これは必須ではありません。現在の Go 実装は、この最適化を利用して、サイズがゼロの変数のメモリを節約します。したがって、C のサイズがゼロであるにもかかわらず、システムは C 型の変数にメモリを割り当てる可能性があります。

ログイン後にコピー

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート