プログラミング言語はメモリ内にオブジェクトを割り当てます。言語はこれを行うためにさまざまな戦略を使用します。 C では、スタックに割り当てられた変数はスタック上に存在しますが、ヒープに割り当てられたメモリは動的に割り当てられます。一方、Python は、参照を使用してオブジェクトにアクセスし、ヒープ上のすべてのオブジェクトを割り当てます。
Go のメモリ割り当てに対するアプローチは、C と Python の両方とは異なります。 Go はオブジェクトの割り当て場所を明示的に指定しませんが、ガベージ コレクションを使用して未使用のメモリを再利用します。これにより、複合型である構造体が Go でどのように割り当てられるかについて疑問が生じます。
同じタスクを実行するように見える次の 2 つの関数について考えてみましょう。
func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) ... return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType ... return &chunk, nil }
これらのサンプル関数ではいくつかの問題が発生します質問:
Go では、スタックは関数の引数、ローカル変数、および戻り値。ヒープは、new を使用して作成されたオブジェクト、またはスタックからエスケープされたオブジェクトを割り当てるために使用されます。
最初の関数では、チャンクは new を使用してヒープに割り当てられます。 2 番目の関数では、Go のエスケープ分析により、&chunk がスタックからエスケープされると判断されるため、チャンクもヒープに割り当てられます。
チャンクは、 2 番目の関数である Go のガベージ コレクターは、関数が戻った後もアクセス可能な状態を維持します。これは、エスケープ分析によってチャンクが関数スコープからエスケープされ、別のオブジェクトによって参照されている限りガベージ コレクターがチャンクを再利用しないと判断されるためです。
構造体が渡されます。これらは複合型であるため、Go では値によって使用されます。代わりにポインターを渡すと、呼び出し先が元の構造体を変更できるようになります。 2 番目の関数の場合、チャンクはヒープ上に割り当てられるため、チャンクへのポインタを渡す必要はありません。ただし、呼び出し元がヒープ上に割り当てられた構造体にアクセスする必要がある場合は、ポインターが使用されます。
以上がGo は構造体のスタック割り当てとヒープ割り当てをどのように処理しますか?また、ガベージ コレクションはどのような役割を果たしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。