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

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

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-26 03:29:08326ブラウズ

Why Do Structs with Identical Fields but Different Orders Have Different Sizes in Go?

フィールド順序が異なる異なる構造体サイズ

提供されたコードでは、フィールドは同じだがフィールド順序が異なる 2 つの構造体 A と B が、異なるサイズを示しています。その理由は次のとおりです。

暗黙的なパディング

データ型のメモリ アライメント要件により、フィールドのアドレスは特定の値の倍数である必要があります。 int64 フィールドの場合、この倍数は 8 バイトです。

構造体 A の最初のフィールドは bool で、1 バイトを要します。後続の int64 フィールドを 8 バイト境界に揃えるために、7 バイトの暗黙的なパディングが a.

構造体 B の後に追加されます。構造体 B では、最初のフィールドは int64 型の b です。すでに位置合わせされているため、後続の int フィールドを位置合わせするために必要な暗黙的なパディングは 3 バイトのみです。これには 4 バイトが必要です。

サイズへの影響

この暗黙的なパディングにより、 A は 24 バイトです (a に 1 バイト、b に 8 バイト、およびパディング 15 バイト)。一方、B は 16 バイトです (a に 1 バイト、パディング 3 バイト、b に 8 バイト、c に 4 バイト)。

ゼロサイズ構造体

構造体 C は完全に宣言されています空の場合、サイズは 0 バイトになります。 Go 言語仕様によれば、ゼロより大きいフィールドを持たない構造体のサイズはゼロです。

アドレス指定可能性とメモリ割り当て

サイズがゼロの値の場合、言語では同じメモリ アドレスが許可されます。個別の変数に再利用されます。これは、:= C{} の場合、システムによって実際にメモリが割り当てられないことを意味します。

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

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