[解決済み] なぜスタックメモリのサイズには制限があるのですか?
疑問点
ヒープでメモリを確保すると、空きRAM(または仮想メモリ)だけが制限されます。Gbのメモリになります。
では、なぜスタックサイズはそれほど制限されているのでしょうか (約 1 Mb)?スタック上に本当に大きなオブジェクトを作成することを妨げる技術的な理由は何でしょうか?
更新 : 私の意図は明確ではないかもしれませんが、私は を望んでいない。 はスタックに巨大なオブジェクトを割り当てたくないし は必要ありません。 より大きなスタックを必要としません。この質問は、純粋な好奇心です。
どのように解決するのですか?
私の直感は次のようなものです。スタックはヒープほど管理しやすいものではありません。スタックは連続したメモリ位置に格納される必要があります。つまり、スタックを必要に応じてランダムに割り当てることはできませんが、少なくともそのための仮想アドレスを予約する必要があります。予約された仮想アドレス空間のサイズが大きければ大きいほど、作成できるスレッドの数は少なくなります。
たとえば、32 ビットアプリケーションは一般に 2GB の仮想アドレス空間を持っています。これは、スタック サイズが 2MB (pthreads のデフォルト) である場合、最大 1024 個のスレッドを作成できることを意味します。これは、Web サーバーのようなアプリケーションでは小さい場合があります。スタック サイズをたとえば 100MB に増やすと (つまり、100MB を予約するが、必ずしもすぐに 100MB をスタックに割り当てるわけではない)、スレッドの数は約 20 に制限され、これは単純な GUI アプリケーションでも制限される可能性があります。
興味深い質問は、なぜ 64 ビット プラットフォームでまだこの制限があるのかということです。ヒープ上に巨大なオブジェクトを割り当てるように注意し、必要であれば手動でスタック サイズを大きくすることです。したがって、64 ビット プラットフォームで巨大スタックのサポートを追加することが有用であるとは誰も思わなかったのです。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】Rのメモリ管理/サイズn Mbのベクトルを割り当てられない
-
[解決済み] プライベートバイト、バーチャルバイト、ワーキングセットとは?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み】ローカル変数のメモリはスコープ外からアクセスできる?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない