LB_INITSTORAGEメッセージについて

解決


kun  2003-07-03 22:47:05  No: 51648

MFCのCListBox等のメンバ関数 InitStorage() についてですが
少し疑問に思っている部分がありますのでお教えください。

---------------------------------------
  CListBox m_ListBox;
  m_ListBox.InitStorage(256, 10);

  CString str;
  for (int i=0; i < 256; i++) {
      str.Format(_T("item string %d"), i);
      m_ListBox.AddString(str);
  }
---------------------------------------
とした場合、InitStorage()で確保したメモリは有効に使われているのでしょうか。

私は InitStorage(256, 10) とした場合、
・AddString()する文字列長が10Byte以下(NULLを含めて?)なら確保したメモリに格納
・AddString()する文字列長が11Byte以上なら新たに通常の方法でメモリを確保

というような動作をすると考えていました。
ですので上記コードでは確保したメモリが無駄になると考えています。

実際はどうなのでしょうか。無駄になっているのでしょうか。
よろしくお願いします。

VC++6.0 + SP5, MFC


YuO  2003-07-03 23:28:49  No: 51649

当然ながら,文字列の部分は利用されません。
#多分,毎回のAddStringで破棄されている。
ただ,文字列以外の部分は利用されていると思います。

ListBoxのデータ構造は,配列だと思ってください。
そして,毎回AddStringで配列を拡張すると,非常に効率が悪いですから,
最初に必要量を確保して,それで間に合う間はそれを使おう,というのがLB_INITSTORAGEです。
std::vectorのreserveのような考え方です。


kun  2003-07-04 00:17:32  No: 51650

YuOさん、回答ありがとうございます。

> 当然ながら,文字列の部分は利用されません。
> #多分,毎回のAddStringで破棄されている。
> ただ,文字列以外の部分は利用されていると思います。

なるほど。確保したもの全てが無駄になるわけでは無いのですね。
自分は文字列の事しか頭にありませんでしたから
今回のコードの InitStorage() は完全に無駄な処理と捉えていました。

Web上MSDNの CListBox::InitStorage() の解説で今回のコードとほぼ同じサンプルを見つけまして、
頭が???状態になっていたのですがYuOさんのおかげで納得できました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加