ホームページ  >  記事  >  バックエンド開発  >  Go クロージャは実際にどのくらいのメモリを消費しますか?

Go クロージャは実際にどのくらいのメモリを消費しますか?

DDD
DDDオリジナル
2024-10-31 21:25:29366ブラウズ

How Much Memory Do Go Closures Actually Consume?

Go クロージャのメモリ レイアウト

別のクロージャ実装を利用する JavaScript とは対照的に、Go クロージャはヒープに保存されます。

クロージャのメモリ割り当て

クロージャを生成する次の関数を考えてみましょう:

<code class="go">type M int

func (m *M) Adder(amount int) func() {
    return func() {
        *m = *m + amount
    }
}</code>

:= m を呼び出すとき.Adder()、2 つのヒープ割り当てが発生します:

  • 16 バイト: 関数ポインタとキャプチャされた変数 (m) へのポインタを格納します。
  • 変数サイズ: キャプチャされた変数のタイプとサイズによって異なります。この場合、これは int であるため、4 バイトかかります。

返された func() 値のメモリ フットプリント

返された func() 値は、 :

  • 32 ビット プラットフォームでは 8 バイト、64 ビット プラットフォームでは 16 バイト: 関数ポインターを格納します。

したがって、合計この例のクロージャのメモリ フットプリントは 32 ビット プラットフォームでは 20 バイト、64 ビット プラットフォームでは 32 バイトです。

例:

<code class="go">func closure() func() *byte {
    var b [4 * 1024]byte
    return func() *byte {
        return &amp;b[0]
    }
}</code>

closure() を呼び出すと、次のものが割り当てられます:

  • 16 バイト: クロージャ メタデータ (関数ポインタ、キャプチャされた変数ポインタ)
  • 4096 バイト: クロージャーによってキャプチャされたバイト配列

結果として、合計メモリ割り当ては 4112 バイト になります。

以上がGo クロージャは実際にどのくらいのメモリを消費しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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