関数の引数で文字列を取得する場合、
string str;
char buf[1024];
a.GetText( buf, 1024 );
str = buf;
ってやるのと、
TCHAR *buf = malloc( 1024 );
a.GetText( buf, 1024 );
str = buf;
free( buf );
ってやるのはどちらの方がいいのでしょうか?
後者の方はバッファ確保失敗のチェックなども入れるとかなり手間がかかり、出来れば前者を使いた
いのですが、大き目のバッファを自動変数で確保するのもあまりよくないと聞いたこともあります。
100バイトぐらいの配列なら迷わず自動変数を使うのですが、1000バイトとなると迷います。
場合によるのかもしれませんが、初心者のためまったく判断が出来ません。
なにかアドバイスをいただけないでしょうか?
きょうび数KBの自動変数でビクつくことはありますまい。
環境や場合による、というのが最終回答なのですが、参考までに。
VCをお使いと仮定すると、デフォルトの「スタックサイズ」は1MBです。
これは、その関数が呼ばれる際の全自動変数+αがこのサイズ以下で
なければならないことを意味します。(呼び出し元の関数の分等も合算して考えます)
他に大量の自動変数がない場合、1KB程度であればまず問題ないとは思います。
# これが、組み込み開発などになると1KBのスタックは問題となる可能性があります。
# ローエンドな開発ではありえない数字です。
そのバッファ領域をメッセージハンドラ内で閉じて使うのであれば、
折衷的な案として以下のような方法も考えられます。
・ウィンドウ作成時にバッファ領域を(動的に)作成してしまう。
・単一ウィンドウハンドラの中でのみ使用する。(排他制御を簡便にするため)
・ウィンドウ破棄時に解放する。
毎回生成するのは時間等のコストもかかるので、これも悪くない選択だと思います。
欠点は、本来関数内でのみ使われる変数が外部スコープからも参照可能になる点です。
# C++ をお使いなら、クラスの中に隠蔽することで多少ましにはなります。
> TCHAR *buf = malloc( 1024 );
タイトルと関係ないですが、ここは
TCHAR *buf = malloc(1024*sizeof(TCHAR));
としたほうがいいでしょう。
TCHARは、UNICODEが定義されている・いないで型が違います。
いろいろ参考になりましたありがとうございます。
> VCをお使いと仮定すると、デフォルトの「スタックサイズ」は1MBです。
多いような少ないような^^;
いままでは、実行ファイルの規模とか、自動変数の使用頻度とかでスタックサイズが変化するのかと
思っていたので、貴重な情報でした。
> そのバッファ領域をメッセージハンドラ内で閉じて使うのであれば、
> 折衷的な案として以下のような方法も考えられます。
ウィンドウ内で使える汎用的なバッファって感じですかね。
少し違和感がありそうですが、その辺は慣れでしょうね・・・・
(初心者なので未だにSTLなども使い心地が悪い^^;)
> TCHARは、UNICODEが定義されている・いないで型が違います。
ご指摘ありがとうございます。
char って書いたつもりが癖で TCHAR になってたみたいですorz