ホームページ  >  記事  >  バックエンド開発  >  Golang フィールドの順序は重要ですか?

Golang フィールドの順序は重要ですか?

WBOY
WBOYオリジナル
2024-09-07 20:30:32691ブラウズ

こんにちは、ホリネズミたち! Golang を使い始めた最初の 1 年間、私はフィールドの順序付けがあるに違いないと考え続けましたが、なぜそれを気にする必要があるのか​​と考えていました。まあ、それは単なるフィールドです、何かが間違っているだけですよね?他のほとんどの初心者と同じように、私もそれを気にする価値はないと考えました。言い換えれば、構造体の特定のフィールドが特定の順序で配置されることがどれほど重要でしょうか?そうですね、とてもお得です!

フィールドの順序付けは、最初は無視される側面の 1 つですが、チュートリアルを進めるにつれて、特に Go がポインターをどのように扱うのかを理解することが非常に重要であることが理解されます。実際、アプリケーションのパフォーマンスを向上させる場合、特に大規模なデータ セットやメモリに負荷がかかりすぎる操作を扱う場合、まさにこの順序が重要です。この残念な欠陥は、なぜそれが Go フィールドの順序付けでそれほど重要なのかをよりよく理解することで修正されるでしょう。

Go は構造体をどのようにメモリに保存しますか?

メモリに配置されると、構造体は連続したメモリのブロックとして表され、その中にすべてのフィールドが構造体の定義に従って順番に配置されます。これはかなり単純に見えるかもしれませんが、この種の線形構成は、特にメモリのアライメントやパディングなどの領域で、非常に重要な効果もいくつか果たします。

メモリのアライメントとパディング

メモリの調整とは、データがメモリにどのように配置され、メモリにアクセスされるかに関するものです。通常、CPUS には、データがメモリ内でフェッチされる場所に関して偏りがある可能性があり、これはアライメント境界と呼ばれます。たとえば、32 ビット整数は 4 バイト目のアドレスに配置またはフェッチする必要があります。構造体に適切に配置されていないフィールドがある場合、ページをめくると、Go コンパイラーがパディング バイトなどを追加することがあります。これはかなり無駄になります。たとえば、この構造体を見てください。

struct example{

a bool   // 1 byte

b int32 // 4bytes;

c bool   // 1byte 

d int64 //8 bytes
}

Golang Field ordering matters?

この不適切な構造体では、アライメント ルールが原因で、Go コンパイラーが次のフィールドの中央に 1 つ以上のパディング バイトを追加する可能性があります。

  • a は 1 バイトですが、b は 4 バイト の位置合わせを必要とするため、パディングは 3 バイト挿入されます

  • b の長さは 4 バイト

  • c の長さは 1 バイト ですが、8 バイトを必要とする d を整列させるために 7asing があるため、パディングが導入されます。

  • d の長さは 8 バイトです

木材が構造用木材であるにもかかわらず、脚のせいでサイズは 24 ですが、中身は 14 しかかかりませんが、実際の中身と詰め物の体積を見てください。 .

パディングを最小限に抑えるためのフィールドの並べ替え

フィールドの順序と構造の検出は、負のマージンの形でスペースを無駄にすることを避けるのに役立ちます。言い換えると:

type Example struct { 

d int64 // 8 bytes

b int32 // 4 bytes

a bool // 1 byte

c bool // 1 byte

}

Golang Field ordering matters?

上記の最適化された構造体:

  • d は 8 バイトを占めます。

  • b は 4 バイトを占めます。

  • a と c は、パディングを必要とせずに、それぞれ 1 バイト を占有します。

この構造のサイズは現在わずか 16 バイトであり、以前の 24 バイト サイズの構造よりも優れています。

なぜこれが重要なのか

一般的な小規模アプリケーションを検討すると、アプリケーションが使用するメモリの量が後者と変わらないことがわかるでしょう。ただし、これは、システムに組み込まれた超高速高頻度取引アプリケーション、またはこれらの忠実な制限が急速に蓄積される可能性のある膨大な量のデータを処理することを目的としたアプリケーションを考慮すると、パフォーマンスとさらにはメモリ領域が重要である構築では当てはまりません。これは、多くの大きな配列や構造体の連結されたスライスを使用して構築または操作する場合にさらに明らかになります。構造体の容量がわずか数バイト大きい場合、バイアスや負荷結合に気づくのはそれほど簡単ではありません。低メモリ アーキテクチャが大量生産され、処理されるインスタンスの量が数百万に達し、少しずつ増えていくと、このような無駄の過剰摂取は前代未聞ではなくなります。

結論

フィールドの順序付けは、Golang 構造体設計の観点から優れているだけでなく、メモリの最適化においても重要な役割を果たします。 Go が構造体とそのピクセルのメモリ レイアウトを行う方法のこの側面を理解すると、実際により効果的な構造体設計が可能になります。メモリを頻繁に使用するアプリケーションが関係する場合、このような重要ではない調整により、パフォーマンスが大幅に向上する可能性があります。次に Go で構造体を定義する機会が来たときは、それらのフィールドをそのままばら撒いてはいけません。代わりに、1 分間かけて順序を検討してください。数日後、自分自身とそのアプリケーションに対して感謝することになるでしょう!

以上がGolang フィールドの順序は重要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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