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

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

Mary-Kate Olsen
リリース: 2024-12-21 03:39:09
オリジナル
371 人が閲覧しました

Why Does Struct Field Order Affect the Size of Go Structs?

フィールドの異なる構造的順序がサイズに影響する

Go では、構造体フィールドが宣言される順序が構造体のサイズに影響を与える可能性があります。なぜですか?

ケーススタディ

type A struct {
    a bool
    b int64
    c int
}

type B struct {
    b int64
    a bool
    c int
}
ログイン後にコピー

これらの構造体のサイズを出力すると、次のことがわかります:

fmt.Println(unsafe.Sizeof(A{})) // Output: 24

fmt.Println(unsafe.Sizeof(B{})) // Output: 16
ログイン後にコピー

同じフィールドがあるにもかかわらず、サイズが異なります。

フィールドの配置とパディング

フィールドが配置されているかどうか特定のメモリ アドレスから開始するかどうかは、ターゲット アーキテクチャによって異なります。たとえば、int64 では 8 バイトのアライメントが必要です。 A では、最初のフィールドは bool、つまり 1 バイトです。 b (int64) を正しく位置合わせするには、a の後に 7 バイトの暗黙的なパディングがあります。

B では、a の後に int (4 バイト) が続くため、パディングは 3 バイトのみ必要です。これはサイズの違いを説明しています。

// Offset (in bytes) for struct A
fmt.Println(unsafe.Offsetof(a.a)) // Output: 0
fmt.Println(unsafe.Offsetof(a.b)) // Output: 8
fmt.Println(unsafe.Offsetof(a.c)) // Output: 16

// Offset for struct B
fmt.Println(unsafe.Offsetof(b.b)) // Output: 0
fmt.Println(unsafe.Offsetof(b.a)) // Output: 8
fmt.Println(unsafe.Offsetof(b.c)) // Output: 12
ログイン後にコピー

サイズがゼロの構造体と変数

type C struct {}
ログイン後にコピー

サイズがゼロの構造体のサイズはゼロであり、メモリ割り当てがないことを示します。サイズ 0 の構造体を参照する別個の変数にもかかわらず、同じメモリ アドレスを共有する可能性があります:

a := C{}
b := C{}
c := [0]int{}
d := [3]C{}

fmt.Printf("%p %p %p %p %p", &a, &b, &c, &d, &d[2])
ログイン後にコピー

出力:

0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c 0x21cd7c
ログイン後にコピー

すべてのアドレスが同じであり、これらのゼロにはメモリ割り当てがないことを示します。 -size 変数。

結論

構造体フィールドの順序付けは、アライメント要件と理由によりサイズに影響を与える可能性があります。暗黙的なパディング。サイズがゼロの構造体は、メモリを割り当てず、個別の変数に同じアドレスを共有する可能性があるため、メモリ使用量を最適化します。

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

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