- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:関数呼び出しでのスタック消費量)
関数呼び出しでのスタック消費量
このQ&Aのポイント
- C++で関数を再帰呼び出しするとスタックオーバーフローとなりました。
- 一回の呼び出しでスタックをe0(224)バイト使用してるようです。
- なぜ(何に)こんなにも多く使うのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
アセンブリ出力見ればよいだけではないかと.
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.3
__RTC_CheckEsp という名前でちょろっと検索かけてみると, オーバーランなんかのチェックみたいですね.
質問者
お礼
その関数はこうなってました。 消費されてる領域とは、直接の関係はないようです。 回答ありがとうございました。 __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
質問者
お礼
そうか~、最近レジスタは多いですからね。 問題が起こってるのはdebugビルドです。 ありがとうございました。
お礼
さっそく見てみました。 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バイト変化するので、デバッグ用だろうと推定しました。 が、具体的に何に使われてるかは不明ですね。 回答ありがとうございました。