文字列取得関数で大き目のバッファを用意する際、自動変数でもいいのでしょうか? – プログラミング – Home

文字列取得関数で大き目のバッファを用意...
 
通知
すべてクリア

[解決済] 文字列取得関数で大き目のバッファを用意する際、自動変数でもいいのでしょうか?


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

関数の引数で文字列を取得する場合、

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バイトとなると迷います。
場合によるのかもしれませんが、初心者のためまったく判断が出来ません。

なにかアドバイスをいただけないでしょうか?


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

きょうび数KBの自動変数でビクつくことはありますまい。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

環境や場合による、というのが最終回答なのですが、参考までに。

VCをお使いと仮定すると、デフォルトの「スタックサイズ」は1MBです。
これは、その関数が呼ばれる際の全自動変数+αがこのサイズ以下で
なければならないことを意味します。(呼び出し元の関数の分等も合算して考えます)
他に大量の自動変数がない場合、1KB程度であればまず問題ないとは思います。

# これが、組み込み開発などになると1KBのスタックは問題となる可能性があります。
# ローエンドな開発ではありえない数字です。

そのバッファ領域をメッセージハンドラ内で閉じて使うのであれば、
折衷的な案として以下のような方法も考えられます。

・ウィンドウ作成時にバッファ領域を(動的に)作成してしまう。
・単一ウィンドウハンドラの中でのみ使用する。(排他制御を簡便にするため)
・ウィンドウ破棄時に解放する。
毎回生成するのは時間等のコストもかかるので、これも悪くない選択だと思います。
欠点は、本来関数内でのみ使われる変数が外部スコープからも参照可能になる点です。
# C++ をお使いなら、クラスの中に隠蔽することで多少ましにはなります。


返信引用
egrath
 egrath
(@egrath)
ゲスト
結合: 18年前
投稿: 1
 

> TCHAR *buf = malloc( 1024 );

タイトルと関係ないですが、ここは
TCHAR *buf = malloc(1024*sizeof(TCHAR));
としたほうがいいでしょう。
TCHARは、UNICODEが定義されている・いないで型が違います。


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

いろいろ参考になりましたありがとうございます。

> VCをお使いと仮定すると、デフォルトの「スタックサイズ」は1MBです。
多いような少ないような^^;
いままでは、実行ファイルの規模とか、自動変数の使用頻度とかでスタックサイズが変化するのかと
思っていたので、貴重な情報でした。

> そのバッファ領域をメッセージハンドラ内で閉じて使うのであれば、
> 折衷的な案として以下のような方法も考えられます。
ウィンドウ内で使える汎用的なバッファって感じですかね。
少し違和感がありそうですが、その辺は慣れでしょうね・・・・
(初心者なので未だにSTLなども使い心地が悪い^^;)

> TCHARは、UNICODEが定義されている・いないで型が違います。
ご指摘ありがとうございます。
char って書いたつもりが癖で TCHAR になってたみたいですorz


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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