【雑談】再帰の限界

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

【雑談】再帰の限界

#1

投稿記事 by みけCAT » 13年前

再帰をしすぎるとスタックオーバーフローで落ちるとよく言われています。
では、いったいどのくらい再帰をすれば落ちるのでしょうか?
それを調べてみたいと思います。
おそらく環境に依存すると思うので、みんなに協力して調べていただけたらありがたいです。
よろしくお願いします。

調べ方は、まず添付したsaiki_test.zipをダウンロードし、解凍してください。
解答するとsaiki_test_0.exe~saiki_test_9.exeがあります。
それぞれのexeファイルを実行すると、数字が大量に表示されたあと、おそらくある所で強制終了します。
強制終了する直前に出力された行の数字をそれぞれのexeファイルについて調べてください。
Windows以外の環境の方は、
sourceフォルダに入っているsaiki_test_0.c~saiki_test_9.cをそれぞれコンパイルし、実行してください。
その際、最適化はかけないでください。(重要)
あとはexeファイルの時と同じです。

報告する際は、
OSの種類(Windowsなどだけでなく、例えばWindows Vista Home Premium SP2 32ビットなど)、
メモリの容量、
ソースをコンパイルした人はコンパイラの種類、
その他関係があると思われる情報とともに報告してください。

報告用テンプレート
OS:
メモリ:
コンパイラ(コンパイルした場合):
saiki_test_0:
saiki_test_1:
saiki_test_2:
saiki_test_3:
saiki_test_4:
saiki_test_5:
saiki_test_6:
saiki_test_7:
saiki_test_8:
saiki_test_9:
その他(必要と思えば):

自分の結果
OS:Windows Vista Home Premium SP2 32ビット
メモリ:2.00GB
コンパイラ:gcc version 3.2.3 (mingw special 20030504-1)
saiki_test_0:130163
saiki_test_1:65081
saiki_test_2:65081
saiki_test_3:65081
saiki_test_4:65081
saiki_test_5:43387
saiki_test_6:43387
saiki_test_7:43387
saiki_test_8:43387
saiki_test_9:32540
その他:なし
添付ファイル
saiki_test.zip
検証用プログラムです。
(42.91 KiB) ダウンロード数: 123 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 【雑談】再帰の限界

#2

投稿記事 by h2so5 » 13年前

OS: MacOS X 10.6
メモリ: 4.00GB
コンパイラ:gcc 4.2
saiki_test_0:523982

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 【雑談】再帰の限界

#3

投稿記事 by softya(ソフト屋) » 13年前

スタックサイズとスタックフレームのサイズは処理系依存と呼び出し規約で決まりますので、このテストの意味が余りありません。それとスレッドのスタックのことも考慮されていません。スタックフレームもcdeclだったりstdcallとC言語でも色々変わります。
「呼出規約 - Wikipedia」
http://ja.wikipedia.org/wiki/%E5%91%BC% ... F%E7%B4%84
あとパソコンでのgccやVC++ならスタックサイズはリンク時に変更が可能です。なのでメモリの容量には依存しません。

それと実際のプログラムはローカル変数やら引数の数やら違うものが多すぎて参考にならないと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jay
記事: 314
登録日時: 14年前
住所: 大阪市
連絡を取る:

Re: 【雑談】再帰の限界

#4

投稿記事 by jay » 13年前

OS:Windows 7 Home Premium 32ビット
メモリ:4.00GB

saiki_test_0:130167
saiki_test_1:65083
saiki_test_2:65083
saiki_test_3:65083
saiki_test_4:65083
saiki_test_5:43559
saiki_test_6:43559
saiki_test_7:43559
saiki_test_8:43559
saiki_test_9:32541

みけCATさんとほぼ同じ数値になりました~
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 【雑談】再帰の限界

#5

投稿記事 by softya(ソフト屋) » 13年前

あと同じ数値にならないのはファイルストリームバッファの吐き出しのタイミングの違いの気がします。
fflush(stdout);
を入れると同じバイナリならパソコンが違っても同じ数字になるのではないでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 【雑談】再帰の限界

#6

投稿記事 by ISLe » 13年前

Mac OS XはUNIX系なのでOSに設定されたスタックサイズがプロセス起動時に与えられます。
limitコマンドで変更できるらしいです。

ウィンドウズは実行ファイルにスタックサイズが記録されていて使用されます。
コンパイラのオプションで変更できます。
実行ファイルのバイナリを書き換えて変更することもできます。
デフォルトのスタックサイズは、MinGW gccとCygwin gccは2MB、Visual C++は1MBです。

わたしも特定のプログラムで再帰できる深さを調べても意味がないと思います。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 【雑談】再帰の限界

#7

投稿記事 by みけCAT » 13年前

>>softya(ソフト屋)さん、ISLeさん
そうですか・・・
すみません。
解決にしておきます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 【雑談】再帰の限界

#8

投稿記事 by softya(ソフト屋) » 13年前

コンパイラやOSの仕組みを知ると言う意味では意義がありますよ。
みけCATさん自身が呼び出し規約とかスタックフレームの構造とか理解したいと言う主旨ならもっと追求すべきだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る