再帰コール関数にて大きめの自動変数バッファを使用する際についての質問ですが、
例えば、
void Func( void )
{
TCHAR buf[1024];
.... bufを使ったプログラム
if( ... ) Func();
}
というプログラムだと、
再帰の階層が深くなるにつれスタックが消費さていく思いますが、
これを、
void Func( void )
{
{
TCHAR buf[1024];
.... bufを使ったプログラム
}
if( ... ) Func();
}
こう書き換えることで、スタックの消費が抑えられるのでしょうか?
過去に似た質問をしましたが、もう一度よろしくおねがいします。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200608/06080015.txt
コンパイラはVC++2005です。
よろしくおねがいします。
>こう書き換えることで、スタックの消費が抑えられるのでしょうか?
実際に試してみればよいのでは?
ブロックを作るのだけで不安ならば、その部分だけ関数にしてしまうとか。
作業用だけの用途ならば、staticなローカル変数にしてしまうとか。
void Func( void )
{
static TCHAR buf[1024];
.... bufを使ったプログラム
if( ... ) Func();
}
それぢゃ再帰にならないとおもう(使う/作業という用語の意図しだいだけど)
「試せ」「アセンブラ出力を読め」に1票
データ量と処理アルゴリズムから必要再帰段数は予想できる。
極端に扁平していない普通の二分木ならlog2(N)となるわけだ。
スタックサイズと使用量から可能再帰段数も予測できる。提示の例なら
1メガ/(1024+その他)となるわけでおよそ1000段(より少し小さいはず)
あとはこの2つを比較して妥当性を判断する技術があるかどうか、で決まる。
スタック消費を抑えたかったら CString に書き換えるだけでかなり違うし...
Blueさんありがとうございます。
> 実際に試してみればよいのでは?
試し方が思いつかなかったのですが、簡単に試せるような言い方なののでいろいろやってたら確認で
きました。
#include <stdio.h>
int ct = 0;
void Func( void )
{
{
char buf[1024];
buf[0] = 0;
}
printf([%d] , ct);
ct++;
Func();
}
void main( void )
{
Func();
}
-------------実行結果-------------
>[0] [1]....[812]
のところでプログラムがストップ。
さらに、Func()の最初の4行をコメント化して実行した結果
----------------------------------
>[0] [1]....[4867]
のところでプログラムがストップ。
ということで、関数の途中で中カッコでくくってもスタックは消費されていくようですね。
Blueさんのいうように、関数化かstaticを使いたいと思います。
tetrapodさんありがとうございます。
> CString
なるほど、噂の動的バッファですか。
たしかにこれならいくら再帰しても関係ないですね。
動的バッファは重いという話も聞いたことがあるのですが、自分で調べてみます。