LB_INITSTORAGEメッセージについて

解決


kun  2003-07-03 13:47:05  No: 51648  IP: [192.*.*.*]

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 14:28:49  No: 51649  IP: [192.*.*.*]

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

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

編集 削除
kun  2003-07-03 15:17:32  No: 51650  IP: [192.*.*.*]

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

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

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

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

編集 削除