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
当然ながら,文字列の部分は利用されません。
#多分,毎回のAddStringで破棄されている。
ただ,文字列以外の部分は利用されていると思います。
ListBoxのデータ構造は,配列だと思ってください。
そして,毎回AddStringで配列を拡張すると,非常に効率が悪いですから,
最初に必要量を確保して,それで間に合う間はそれを使おう,というのがLB_INITSTORAGEです。
std::vectorのreserveのような考え方です。
YuOさん、回答ありがとうございます。
> 当然ながら,文字列の部分は利用されません。
> #多分,毎回のAddStringで破棄されている。
> ただ,文字列以外の部分は利用されていると思います。
なるほど。確保したもの全てが無駄になるわけでは無いのですね。
自分は文字列の事しか頭にありませんでしたから
今回のコードの InitStorage() は完全に無駄な処理と捉えていました。
Web上MSDNの CListBox::InitStorage() の解説で今回のコードとほぼ同じサンプルを見つけまして、
頭が???状態になっていたのですがYuOさんのおかげで納得できました。
ありがとうございました。