2

特定のコンパイラと OS の組み合わせの最大スタック サイズを調べる方法に興味があります。Ubuntu/GNU コンパイラを使用しています。私がさらに持っているいくつかの質問は次のとおりです。

  1. デフォルトの最大スタック サイズを制御するのは誰か。OSまたはコンパイラ?
  2. デフォルトの最大値は総メモリに応じてスケーリングされますか? (つまり、メモリが 2GB のマシンは、メモリが 512MB しかないマシンよりデフォルト サイズが大きくなります)。

ありがとう!

4

4 に答える 4

8

デフォルトの最大スタック サイズを制御するのは誰か。OSまたはコンパイラ?

通常、コンパイラ。OS/ハードウェアによって、ある程度制限されます。Linux IIRC のデフォルトは 8MB です。Linuxを考えulimit -sてみてください (スタック サイズを変更するため)。

デフォルトの最大値は総メモリに応じてスケーリングされますか? (つまり、メモリが 2GB のマシンは、メモリが 512MB しかないマシンよりデフォルト サイズが大きくなります)。

いいえ。自分でやらない限り、コンパイラ スイッチを介してスタック サイズを変更できます。

ld --stack=<STACK_SIZE>

また

gcc -Wl,--stack=<STACK_SIZE>

スタックとヒープの問題に対する C++ 標準の見解:

この標準は抽象的なマシンに基づいており、ハードウェアやスタック、ヒープにはあまり関係していません。割り当てられたストアとフリーストアについて話します。フリー ストアは、(ほとんどの場合) new を呼び出している場合に表示される場所です。FWIW、実装では、オブジェクトの割り当てに関して、スタックとヒープの両方としてマスカレードするメモリ領域を 1 つだけ持つことができます。

したがって、あなたの質問は、言語の問題ではなく、実装固有の問題に要約されます。

お役に立てれば。

于 2009-03-25T16:54:30.560 に答える
3

Linux (Ubuntu) では、オペレーティング システムが最大サイズを制御します。参照については、「man limit」または「man ulimit」を参照してください。

于 2009-03-25T16:53:55.677 に答える
2

現在、正しい質問は次のとおりです。スレッドに割り当てられているメモリの量。 各スレッドは、通常、スレッド作成時に制御できる量を取得します。

一部のOSには(歴史的に)制限がありましたが、パート1に答えるために、コンパイラ/スレッドシステムが選択します。

2 の場合、スケーリングされません。

于 2009-03-25T16:54:40.277 に答える
0

これを移植可能に行う方法はありません。C++ 標準は実際にはスタックを必要としません。

于 2009-03-25T16:53:45.803 に答える