5

最近、Dinkumware C++11<regex>ライブラリでスタック オーバーフローの問題が発生しましたが、これまでのところ、スタック コミットとスタック リザーブのサイズを 2 倍にすることで問題を回避しています (まだ問題は発生していません)。

ただ、スタックサイズを大きくするデメリットはあるのか気になるし、さらにスタックコミットとスタックリザーブの違いがよくわからない(ただし、スタックコミットはスタックよりかなり小さい)予約)。

4

1 に答える 1

4

スタックサイズを増やすことの明白な結果は、より多くのメモリ使用量です。ほとんどの場合、スタックはメモリ全体に比べて巨大ではないため、大きな問題にはなりません。

明らかに、それぞれ大きなスタックを使用するスレッドが多数ある場合、マシンで使用可能なメモリが大量になる可能性があります。特に、マシンが最初から大量のメモリを持っていない場合は特にそうです。

「予約済み」スペースが割り当てられますが、「タッチ」されるまで実際には物理的に存在しません。つまり、ここでは物理メモリスペースはスタックに割り当てられません。割り当てのために仮想メモリマップから取り出されたスペースだけです(したがって、 、アプリケーションが 32 ビット環境で取得できるのと同じくらい多くのメモリを必要とするために仮想空間が不足している場合でも、それが要因になる可能性があります)。

「コミットされた」スペースには物理メモリが接続されています(ディスクにスワップアウトすることはできますが、どこかで物理メモリが利用可能でなければなりません)。これは、全体的なメモリが不足しているシステムの要因であり、数ギガバイトの RAM が利用可能なマシンでは、最近ではあまり一般的ではない傾向にあります。

コミットされていない大規模な予約済み領域を使用することの副作用は、アプリケーションが物理メモリを使い果たす可能性があることです。これは、メモリにアクセスするだけで「エラー」が発生するため、アプリケーションでは検出できません。ただし、利用可能な物理メモリ (スワップ領域を含む) がないため、アプリケーションを強制終了する必要があります [または、Linux OOM キラーの場合は「有罪に見える」他のアプリケーション]。

于 2013-07-13T14:33:33.107 に答える