特定のコンパイラと OS の組み合わせの最大スタック サイズを調べる方法に興味があります。Ubuntu/GNU コンパイラを使用しています。私がさらに持っているいくつかの質問は次のとおりです。
- デフォルトの最大スタック サイズを制御するのは誰か。OSまたはコンパイラ?
- デフォルトの最大値は総メモリに応じてスケーリングされますか? (つまり、メモリが 2GB のマシンは、メモリが 512MB しかないマシンよりデフォルト サイズが大きくなります)。
ありがとう!
デフォルトの最大スタック サイズを制御するのは誰か。OSまたはコンパイラ?
通常、コンパイラ。OS/ハードウェアによって、ある程度制限されます。Linux IIRC のデフォルトは 8MB です。Linuxを考えulimit -s
てみてください (スタック サイズを変更するため)。
デフォルトの最大値は総メモリに応じてスケーリングされますか? (つまり、メモリが 2GB のマシンは、メモリが 512MB しかないマシンよりデフォルト サイズが大きくなります)。
いいえ。自分でやらない限り、コンパイラ スイッチを介してスタック サイズを変更できます。
ld --stack=<STACK_SIZE>
また
gcc -Wl,--stack=<STACK_SIZE>
スタックとヒープの問題に対する C++ 標準の見解:
この標準は抽象的なマシンに基づいており、ハードウェアやスタック、ヒープにはあまり関係していません。割り当てられたストアとフリーストアについて話します。フリー ストアは、(ほとんどの場合) new を呼び出している場合に表示される場所です。FWIW、実装では、オブジェクトの割り当てに関して、スタックとヒープの両方としてマスカレードするメモリ領域を 1 つだけ持つことができます。
したがって、あなたの質問は、言語の問題ではなく、実装固有の問題に要約されます。
お役に立てれば。
Linux (Ubuntu) では、オペレーティング システムが最大サイズを制御します。参照については、「man limit」または「man ulimit」を参照してください。
現在、正しい質問は次のとおりです。スレッドに割り当てられているメモリの量。 各スレッドは、通常、スレッド作成時に制御できる量を取得します。
一部のOSには(歴史的に)制限がありましたが、パート1に答えるために、コンパイラ/スレッドシステムが選択します。
2 の場合、スケーリングされません。
これを移植可能に行う方法はありません。C++ 標準は実際にはスタックを必要としません。