再帰関数で大き目のバッファを自動変数で確保する際の質問 – プログラミング – Home

再帰関数で大き目のバッファを自動変数で...
 
通知
すべてクリア

[解決済] 再帰関数で大き目のバッファを自動変数で確保する際の質問


初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

再帰コール関数にて大きめの自動変数バッファを使用する際についての質問ですが、

例えば、

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です。
よろしくおねがいします。


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

>こう書き換えることで、スタックの消費が抑えられるのでしょうか?
実際に試してみればよいのでは?
ブロックを作るのだけで不安ならば、その部分だけ関数にしてしまうとか。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

作業用だけの用途ならば、staticなローカル変数にしてしまうとか。

void Func( void )
{
static TCHAR buf[1024];

.... bufを使ったプログラム

if( ... ) Func();
}


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

それぢゃ再帰にならないとおもう(使う/作業という用語の意図しだいだけど)
「試せ」「アセンブラ出力を読め」に1票

データ量と処理アルゴリズムから必要再帰段数は予想できる。
極端に扁平していない普通の二分木ならlog2(N)となるわけだ。
スタックサイズと使用量から可能再帰段数も予測できる。提示の例なら
1メガ/(1024+その他)となるわけでおよそ1000段(より少し小さいはず)
あとはこの2つを比較して妥当性を判断する技術があるかどうか、で決まる。

スタック消費を抑えたかったら CString に書き換えるだけでかなり違うし...


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

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を使いたいと思います。


返信引用
初心者
 初心者
(@初心者)
ゲスト
結合: 24年前
投稿: 206
Topic starter  

tetrapodさんありがとうございます。

> CString
なるほど、噂の動的バッファですか。
たしかにこれならいくら再帰しても関係ないですね。
動的バッファは重いという話も聞いたことがあるのですが、自分で調べてみます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました