提供されたコードでは、フィールドは同じだがフィールド順序が異なる 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 サイトの他の関連記事を参照してください。