Go クロージャのメモリ レイアウトがヒープ割り当てを明らかにする方法
Go クロージャは、周囲の関数で定義された変数を参照できることで注目に値します。 。これにより、メモリの割り当てとレイアウトに関する疑問が生じます。
クロージャのメモリ レイアウト
Go の関数リテラル (本質的にはクロージャ) は、変数に割り当てることも、直接呼び出すこともできます。クロージャは周囲の関数の変数を保持し、アクセスできなくなるまで存続します。
Go プログラミング言語仕様によれば、関数呼び出し後に存続する変数はヒープに配置されます。したがって、Go クロージャはヒープに保存されます。
分析例
関数 Closure() を考えてみましょう:
<code class="go">func closure() func() *byte { var b [4 * 1024]byte return func() *byte { return &b[0] } }</code>
Each Closure()呼び出しの結果、2 つのヒープ割り当てが行われます:
したがって、合計 4112 バイト
重要なポイント
Go クロージャはヒープ上に存在する単なる変数であり、クロージャとその周囲の関数間の共有変数の永続性を確保します。 。この単純なメモリ レイアウトにより、クロージャ変数の効率的な割り当てとアクセスが可能になります。
以上がGo クロージャがヒープに割り当てられるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。