Go のクロージャのメモリ レイアウト
クロージャを含む Go 関数は字句スコープを実装し、それを囲んでいるスコープで宣言された変数を参照できるようにします。 。この動作では、これらのクロージャがメモリ内でどのように表現されるかという疑問が生じます。
Go では、クロージャは基本的に、クロージャが作成された環境を参照する変数です。クロージャに割り当てられたメモリは次のもので構成されます:
クロージャに割り当てられるメモリのサイズはプラットフォームとアーキテクチャによって異なりますが、通常は次のものが含まれます:
たとえば、次のクロージャを考えてみましょう:
type M int func (m *M) Adder(amount int) func() { return func() { *m = *m + amount } }
コードが := m.Adder() を呼び出すと、2 つのクロージャが作成されます:
最初のクロージャのメモリ レイアウトは以下で構成されます:
割り当てられる合計メモリは 16 バイトです。
2 番目のクロージャのメモリ レイアウトは次で構成されます:
割り当てられる合計メモリは 24 バイトになります。
要約すると、Go クロージャはヒープ上に実装され、関数コードへのポインタとキャプチャされた変数への参照を保存します。割り当てられるメモリのサイズは、キャプチャされた変数の数とプラットフォームのアーキテクチャによって異なります。
以上がGo クロージャはメモリ内でどのように表現されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。