2009-03-25 6 views
2

特定のコンパイラ/ osコンボの最大スタックサイズを調べる方法が不思議です。私はUbuntu/GNUコンパイラを使用しています。私が加えているいくつかの質問は次のとおりです。Linux上でC++プログラムのメモリスタックの最大サイズを調べるにはどうすればよいですか? (gnuコンパイラ)

  1. 誰がデフォルトの最大スタックサイズを制御しますか。 OSやコンパイラ?
  2. デフォルトの最大値は合計メモリに応じて調整されますか? (つまり、2GBのメモリを搭載したマシンは、512MBしか搭載していないマシンよりもデフォルトサイズが大きくなります)。この例では、両方のマシンが同じOS /コンパイラ設定であり、システムRAMの量が異なります。

ありがとう!

答えて

6

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

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

デフォルトの最大値は合計メモリに応じて調整されますか? (つまり、2GBのメモリを搭載したマシンは、512MBしか搭載していないマシンよりもデフォルトサイズが大きくなります)。この例では、両方のマシンが同じOS /コンパイラ設定であり、システムRAMの量が異なります。

いいえあなたがそれをしない限り、yiurself.Youはコンパイラスイッチでスタックサイズを変更できます。

ld --stack=<STACK_SIZE> 

または

gcc -Wl,--stack=<STACK_SIZE> 

スタックとヒープの問題に関するC++標準のテイク:

標準抽象機械に基づいており、実際に自分自身に関係しませんハードウェアまたはスタックまたはヒープ。割り当てられたストアとフリーストアについて話しています。フリーストアは、あなたが新しい(主に)電話をしている場合のあなたの場所です。 FWIWの実装では、オブジェクトの割り当てに関して、スタックとヒープの両方に偽装するメモリ領域を1つしか持たないことがあります。

あなたの質問は、言語問題ではなく実装固有の問題であることが判明しています。

これが役に立ちます。

+0

もし私があなたにアップアップすることができたら私はそうするでしょう。これは大いに助けてくれた、説明してくれてありがとう。 – RyanY

+0

upvotingについて心配しないでください。お力になれて、嬉しいです。さらに質問がある場合はお知らせください。 – dirkgently

+0

--stack =についての答えの部分は完全に間違っています:ここでは、 'info ld'が言っていることです:このオプションは、リンカーのi386 PEターゲットポートに固有です。 UNIXシステムでは、コンパイラは通常、スタック制限を行うために* nothing *を持ちます。 –

0

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

+0

さて、私は非常に混乱しています。スタックがC++メモリの不可欠な領域であったという印象を受けました。スタックなしでC++プログラムがどのように動作するか説明してください。ありがとうございました。 – RyanY

+0

C++標準は実装に負担をかけません。割り当てられたストアとフリーストアについてのみ話します。あなたはフリーストアのものを買うために新しいことをするでしょう、そうでなければ割り当てられた店でフォールバック - あなたはドリフトを取得します。 – dirkgently

+0

コンパイラは、CPUレジスタ(別名スタック)によってインデックスされたメモリブロックではなく、呼び出しフレームのリンクリストを使用できます。私が知っているすべての実装は後者を使用しますが、C++標準ではそれを必要としません。 –

3

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

2

今日、正しい質問は、どのくらいのメモリが私のスレッドに割り当てられているかです。各スレッドは、通常、スレッド作成時に制御できる量を取得します。

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

2の場合、スケールされません。