• ベストアンサー

最大スタックサイズを大きくすることの影響は?

再帰呼び出しを行うプログラムでスタックオーバーフローが発生するようになりました。 そこで最大スタックサイズを変更しようと考えていますが 最大スタックサイズを大きくすることで何か影響があることはあるのでしょうか? 他アプリ等に影響が出ないかを懸念しています。 ※最大スタックサイズは最大で16Mらしく、現在は1Mです。  特に影響がないのであれば最初から16Mにしておけば良いような気もして疑問に思っています。

質問者が選んだベストアンサー

  • ベストアンサー
noname#208124
noname#208124
回答No.4

スレッドごとにスタックが確保されるのでプロセスで使用可能な最大スレッド数が減ります 他プロセスへの影響は起こりえません

ann1222
質問者

お礼

「他プロセスへの影響は起こりえません」とのこと。 まさに知りたい情報でした。 ありがとうございました。

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

アプリがWindow上でということなら1プロセスに使えるメモリー空間は2GBだったと思います ヒープやスタックの予約サイズ、コードなどを合計し2GBを超えると起動が出来なくなるのでそのあたりの余裕を少し見たほうがいいように思います 16MBが最大なら10-12MBぐらいにしたほうが 今後、コードの多少の手直しでもスタックサイズをいじらなくてもいいように

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

念のため確認させてください。 スタックサイズを16Mバイトにすれば、期待通りに動くのでしょうか? 何かのバグで、再帰呼び出しが止まらない可能性もありますので。

ann1222
質問者

補足

単純に2Mにすれば動くことは確認できています。 バグではない認識です。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

再帰関数に与える引き数が「構造体やオブジェクトの実体渡し」になっていませんか? また、引き数の数が3個以上になっていませんか? また、再帰関数の関数内で定義されている変数が多かったり、配列変数を定義していたりはしませんか? 再帰関数の引き数は「int が1つか2つ」にしましょう。 再帰関数の関数内でauto変数を定義する場合は、int変数など、単純変数のみにしましょう。 再帰関数の関数内で「char buf[256];」などのように、文字列操作用のchar配列変数をauto変数で定義してはいけません。 この辺りを改善すれば、スタックは1Mもあれば「余りまくり」です。

ann1222
質問者

補足

コーディング上の問題は重々承知しおりますが 何せ古いコーディングで大きな改修は難しいのが現状です。 単純にスタックサイズを大きくすることで ”当面”は解決するため、最大スタックサイズ変更の影響を知りたいと思っている次第です。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

1MBで足りなくなる再帰ならロジックを考え直したほうがいいように思います 本当に想定どおりで1MB以上のスタックが必要になるのでしょうか? ロジック的なバグでいらぬ再帰が掛かっているのではありませんか

ann1222
質問者

補足

コーディング上の問題は重々承知しおりますが 何せ古いコーディングで大きな改修は難しいのが現状です。 単純にスタックサイズを大きくすることで ”当面”は解決するため、最大スタックサイズ変更の影響を知りたいと思っている次第です。 処理レコード件数が増えると再帰回数が増える作りですので 今後のレコード件数増加を想定してスタックサイズを決定できればと思っています。

関連するQ&A

  • C# 再帰よるスタックオーバーフローについて

    VB2008 C# でプログラムしていますが、 プログラムで再帰を多く行わなくてはならず、 スタックオーバーフローが出てしまいます。 スタックオーバーフローを解決するためには、アルゴリズムを変更し、 再帰の回数を減らすしか方法はないのでしょうか? もしスタックの上限を変更する方法などがありましたら教えてください。 VBは初心者なので、なるべく簡単にお願いします。

  • VC6でコンパイルでスタックの領域を増やすには?

    初めて、VisualC++6.0で再帰を行うプログラムを書いているのですが、 スタックオーバースローなのか、突然プログラムが終了し、タスクバーにあった実行中のアプリが消えてなくなります。 原因がまだわからないのですが、スタックを増やす方法が知りたいのですが、どうすればよいのでしょうか? また、このように突然アプリが終了するので、どこが原因かわからないのですが、実行中に警告表示するような機能はありますか?

  • VC++ 再帰呼び出しについて

    VC++6.0にてプログラミングを行っているものですが、 関数の再帰呼び出しについて質問です。 再帰呼び出しの際にスタックに積まれる変数というのは、 再帰呼び出しをする関数に渡す引数のことですか? スタックオーバーフローを起こさないために、 staticなポインタにHeap領域上の 変数を割り当てるとよい。 と分かったのですが、 この意味は、例えば static int *a = new int; ということなのですか?

  • C++のスタック管理

    大きめの配列(2Mくらい)を宣言するとスタックオーバーフローのエラーが発生します。で、配列をstaticにしたらエラーが発生しなくなりました。 なんとなく、初期に大きいバッファを確保するならOKで実行時に確保するとNGなのかな~と思っているのですが、このあたりのことを教えていただけないでしょうか。 なんとなく2Mくらいでオーバーフローが出るのも納得できません。 よろしくお願いします。 環境:VC++ .Net + winXP

  • .NET(C#)でのスタックオーバーフロー回避方法

    ASP.NET初心者です。初めて質問させていただきます。 ASP.NET(C#)でwin32系の外部ライブラリを使用したいのですが、そのライブラリを読み込むところで スタックオーバーフローが発生してしまいます。 同じライブラリをWindowsアプリケーション(C#)で使用したところ問題なく実行できました。 ASP.NETで同じように使用しようとするとスタックオーバーフローが発生してしまう状態です。 [デバッグ中のエラーメッセージ] xxxx.dllを読み込めません。再帰が深すぎます。スタックがオーバーフローしました。 [イベントログ] 障害が発生しているアプリケーション名: w3wp.exe、バージョン: 7.5.7600.16385、タイム スタンプ: 0x4a5bcd2b 障害が発生しているモジュール名: xxxx.dll_unloaded、バージョン: 0.0.0.0、タイム スタンプ: 0x4d92e27c 例外コード: 0xc0000005 xxxx.dllは、今回使用したいDLLです。 過去の質問等でスタックオーバーフローが発生した場合の解決策を探してはみたのですが、見つけられた方法が以下の2つでどちらもうまくいきませんでした。 (1)スタック領域を大きくする →スレッドでスタック領域を指定して実行してみました。 (2)ライブラリの中身をスタックオーバーフローが起きないように変更する → ライブラリの中身は変更できない状態です。 (1)のほうは、指定方法間違えてるかもしれません。。。 Thread newthread = new Thread(new ThreadStart(init), 0); もしくは、w3wp.exeでエラーが発生しているということはIIS関係で何かおかしなことをしてしまってるのかもとか・・・。 根本から見方が間違ってるかもしれませんが、(1)の方法の正しいやり方、もしくはそれ以外の解決策をご教授頂きますようよろしくお願いいたします。

  • VC++6.0 Stack Overflow !!

    私はVC++6.0で画像処理のプログラムを作っています。 再帰構造を用いたある関数を呼ぶと、対象の画像によって、スタックオーバーフローでプログラムが止まってしまいます。 これを避ける方法や、スタックのサイズの変更方法がありましたら教えてください。 なお、現在、VC++のメニューの「プロジェクト」→「設定」→「リンク」タブ→「アウトプット」カテゴリからスタックアロケーションの予約のところを適当な大きな数を入力しているのですが、効果はありません。

  • gccでスタックオーバーフローのチェック

    OS:WindowsXP コンパイラ: MinGW gcc 3.3.3 gccで、スタックオーバーフローの検出を行いたいと思っています。 gcc -v --helpで見ると > -fstack-check Insert stack checking code into the program と書かれているので、そのように指定して、無限に自分を呼び続ける再帰のプログラムを走らせてみました。 gcc -fstack-check testS2.c  ですが、オプションを指定しない時と同じように突然何の前触れもなく終了してしまいます。  このオプションはスタックを使い切るかどうかをチェックするオプションではないのでしょうか。  よろしくお願いいたします。

  • 再帰呼び出しになってしまうのをループの形にしたい

    VBで繰り返して実行するプログラムを作ったのですが、 スタック領域をオーバーしてしまいます。 再帰呼び出しになっているのはわかったのですが、 改善ができません。 簡略したら下記のような状態でした。 Sub test1()  test2 End Sub Sub test2()  test1 End Sub このtest1を実行して、繰り返し作動するようにしたのですが、 当然スタックオーバーフローになります。 簡単にループに変形できるのでしょうか?

  • 関数呼び出しでのスタック消費量

    C++で関数を再帰呼び出しするとスタックオーバーフローとなりました。 それで、どれ位なら可能か調べるため、次の関数で試してみました。 int null(void) {  int a;  return null(); } 結果は次の通りでした。 1回目 &a 0x001cf9d4 2回目 &a 0x001cf8f4 3回目 &a 0x001cf814 よって、一回の呼び出しでスタックをe0(224)バイト使用してるようです。 なぜ(何に)こんなにも多く使うのでしょうか? 環境は、Vista Home Premium、Microsoft Visual C++ 2010 Express です。

  • スタックオーバーフローとでてきて、ちゃんと動きませ

    https://okwave.jp/qa/q9340961.html の続き ncaught RangeError: Maximum call stack size exceeded 変更後によってブラウザはフリーズしなくなりましたが、まだスタックオーバーフローとでてきて、ちゃんと動きません。 forをなくしてもまだループ処理によって問題が起きているのでしょうか? https://codepen.io/anon/pen/zzqjKg

専門家に質問してみよう