2

Haskellで再帰関数をプログラミングしているときに質問がありました。特定の言語(またはHaskell)のコールスタックが特定の時点でメモリ不足になる可能性はありますか?

ありがとう :)

4

4 に答える 4

3

メモリの量には限りがあり、呼び出しスタックの各フレームがゼロ以外のバイト数を使用する場合(末尾呼び出しの最適化により、これは少し複雑になります)、十分に深い再帰でリソースを使い果たすことができなければなりません。 。基本的なロジック。

とはいえ、どれだけ深く進むことができるかは、スタックの実装によって異なります。スタックが通常の割り込みスタック(その言語との関連付けからCスタックとも呼ばれる)に実装されている場合、使用可能なスペースは非常に限られており、小さなフレームでかなり深くなるのに十分ですが、フレームサイズが大きくなると実際に制限されます(より大きなタイプのより多くの変数を使用)。すべての言語が割り込みスタックを使用するわけではなく、代わりにスタックをヒープスペース(はるかに大きい)に配置します。

于 2012-06-28T21:49:59.307 に答える
2

通常、スタックサイズはCの場合のように、Haskellの実装では問題になりません。これは、非標準の仮想マシンを備えた関数型言語であるためです。つまり、その関数呼び出しはプロセススタックフレームに直接マップされません。それらは管理されており、ヒープ(Stackless Pythonなど)に割り当てることができます。ただし、サイズは有限であり、とにかくスタックオーバーフローが発生する可能性があります。

于 2012-06-28T21:59:43.750 に答える
1

はい、できます。それはその特定のプログラムのスタックに割り当てられたリソースに依存しますが、それがあまりにも熱心である場合、それは最終的にスタックオーバーフローで終わります。ウィキペディアでより多くの情報と例を見つけることができます。

于 2012-06-28T21:48:39.683 に答える
0

はい。スタックは単なるメモリの領域であるため、有限のリソースであり、悪用すると不足する可能性があります。C ++では、これは再帰だけでなく、ヒープではなくスタック上に作成される変数が多すぎるか(または大きすぎる)場合に適用されます。

于 2012-06-28T21:49:37.480 に答える