1. ホーム
  2. c++

[解決済み] なぜスタックメモリのサイズには制限があるのですか?

2023-01-28 06:49:33

疑問点

ヒープでメモリを確保すると、空きRAM(または仮想メモリ)だけが制限されます。Gbのメモリになります。

では、なぜスタックサイズはそれほど制限されているのでしょうか (約 1 Mb)?スタック上に本当に大きなオブジェクトを作成することを妨げる技術的な理由は何でしょうか?

更新 : 私の意図は明確ではないかもしれませんが、私は を望んでいない。 はスタックに巨大なオブジェクトを割り当てたくないし は必要ありません。 より大きなスタックを必要としません。この質問は、純粋な好奇心です。

どのように解決するのですか?

私の直感は次のようなものです。スタックはヒープほど管理しやすいものではありません。スタックは連続したメモリ位置に格納される必要があります。つまり、スタックを必要に応じてランダムに割り当てることはできませんが、少なくともそのための仮想アドレスを予約する必要があります。予約された仮想アドレス空間のサイズが大きければ大きいほど、作成できるスレッドの数は少なくなります。

たとえば、32 ビットアプリケーションは一般に 2GB の仮想アドレス空間を持っています。これは、スタック サイズが 2MB (pthreads のデフォルト) である場合、最大 1024 個のスレッドを作成できることを意味します。これは、Web サーバーのようなアプリケーションでは小さい場合があります。スタック サイズをたとえば 100MB に増やすと (つまり、100MB を予約するが、必ずしもすぐに 100MB をスタックに割り当てるわけではない)、スレッドの数は約 20 に制限され、これは単純な GUI アプリケーションでも制限される可能性があります。

興味深い質問は、なぜ 64 ビット プラットフォームでまだこの制限があるのかということです。ヒープ上に巨大なオブジェクトを割り当てるように注意し、必要であれば手動でスタック サイズを大きくすることです。したがって、64 ビット プラットフォームで巨大スタックのサポートを追加することが有用であるとは誰も思わなかったのです。