4

スタックサイズは、実行時にヒープのように大きくなる可能性があるのでしょうか。

4

6 に答える 6

7

ローカル変数を割り当てて関数呼び出しを行うと、使用されるスタックの量は確実に増加します。スタックの最大サイズが大きくなるかどうかは技術的には定義されていませんが、実際には一般的に一定です。OSへのフラグを使用して定数を大きくすることができますが、通常、各スレッドは特定のサイズのスタックを取得します。使いすぎると、スタックオーバーフローになります。

于 2009-11-03T05:25:07.610 に答える
3

実際に割り当てられるスタックサイズは、最新のデスクトップオペレーティングシステムでは大きくなる可能性があります。

実際には、メモリ管理ユニットの観点から実装されています。スタックの現在コミットされているページを超えてメモリにアクセスすると、新しいメモリページがコミットされます。RAMで使用されるのは、実際に使用されているページ(および通常は1つのガードページ)のみです。最大スタックスペースは、システムリソースの制限によって制御できます。たとえば、POSIX.1-2001では、。を使用してプロセスの最大スタックサイズを照会できますgetrlimit()

一方、ハードウェアベースのメモリ管理ユニットがない古いオペレーティングシステムや多くの組み込みシステムでは、スタックサイズに固定の制限が設定されています。

于 2009-11-03T08:09:37.980 に答える
1

実行可能スタックのサイズはコンパイラ/リンカーによって決定されると思います。したがって、実行時に変更することはできません。スレッドのスタックサイズを変更できます。+すべてがコンパイラとOSに固有であるため、ここに単一の答えはありません。

于 2009-11-03T05:28:42.750 に答える
0

私が覚えていることから、スタックは通常、連続したメモリ範囲に存在するという仮定の下で動作します。基本的に、次のスタックフレームがメモリの次のビットにあることを期待します(これにより、命令のルックアップを行う必要がなく、より高速に実行できます)。他の人が言っているようにそれは可能ですが、私はそれが広く使われているとは思いません。

于 2009-11-03T06:24:16.463 に答える
0

スレッドのスタックスペースはコンパイラによって設定されます。私のコンパイラは2Mbのスペースを予約します。そして、1Mbをコミットします。

もちろん、コンパイラのデフォルトのスタックサイズを変更することも、CreateThreadを呼び出してより大きなスタックサイズで新しいスレッドを開始することもできます。 http://msdn.microsoft.com/en-us/library/ms682453%28VS.85%29.aspx

于 2009-12-03T05:23:10.110 に答える
-2

はい。答えは本当だと思います

于 2010-02-04T19:41:01.690 に答える