• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:関数呼び出しでのスタック消費量)

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

このQ&Aのポイント
  • C++で関数を再帰呼び出しするとスタックオーバーフローとなりました。
  • 一回の呼び出しでスタックをe0(224)バイト使用してるようです。
  • なぜ(何に)こんなにも多く使うのでしょうか?

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

アセンブリ出力見ればよいだけではないかと.

fusem23
質問者

お礼

さっそく見てみました。 int null(void) { push ebp mov ebp,esp sub esp,0CCh push ebx push esi push edi lea edi,[ebp-0CCh] mov ecx,33h mov eax,0CCCCCCCCh rep stos dword ptr es:[edi]  int a;  return null(); call null } pop edi pop esi pop ebx add esp,0CCh cmp ebp,esp call __RTC_CheckEsp mov esp,ebp pop ebp ret pushされてるのは、eip, ebp, ebx, esi, ediの5つで20バイト。 それ以外にcc(204)バイトが使われているようですね。 定数で埋め尽くされることと、変数1つで大きさが12バイト変化するので、デバッグ用だろうと推定しました。 が、具体的に何に使われてるかは不明ですね。 回答ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

__RTC_CheckEsp という名前でちょろっと検索かけてみると, オーバーランなんかのチェックみたいですね.

参考URL:
http://www.glamenv-septzen.net/view/693
fusem23
質問者

お礼

その関数はこうなってました。 消費されてる領域とは、直接の関係はないようです。 回答ありがとうございました。 __RTC_CheckEsp: jmp _RTC_CheckEsp _RTC_CheckEsp: jne esperror ret

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

releaseビルドかdebugビルドかでも変わりますが、ローカル変数だけでなく戻り番地とかレジスタを退避するのでスタックフレームのサイズは大きいです。あとコンパイルがC++かC言語かとか呼出規約がcdeclやstdcallなのかとかでも変わると思います。 「コールスタック - Wikipedia」 http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%AB%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF 「呼出規約 - Wikipedia」 http://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84

fusem23
質問者

お礼

そうか~、最近レジスタは多いですからね。 問題が起こってるのはdebugビルドです。 ありがとうございました。

関連するQ&A