ドキュメントによると、CSimpleArray は少数のオブジェクトを処理するためのものです。この文脈で小さいとは何ですか?CSimpleArray は良い選択ですか、それとも常に CAtlArray などの別のコレクション クラスを使用する必要がありますか?
1 に答える
ここでの「小さい」は経験則であり、2 つのクラスが内部でメモリを管理する方法に由来します。基本的に、CAtlArray は、使用するメモリをよりきめ細かく制御し、CSimpleArray はメモリを単純かつ単純に処理します。
具体的には、要素が CSimpleArray に追加されるときに、配列が割り当てられたすべてのメモリを既に使用している場合、そのサイズは 2 倍になります。これはかなりコストのかかる操作です。新しく作成された CSimpleArray は、0 アイテムのスペースで始まります。では、配列に 5 つのものを追加するとします。次のようになります。
- 最初のアイテムを追加 - スペースがないため、合計 1 つのアイテムのスペースを再割り当てします
- 2 番目のアイテムを追加 - スペースがないため、合計 2 つのアイテムのスペースを再割り当てします
- 3 番目のアイテムを追加 - スペースがないため、合計 4 つのアイテムのスペースを再割り当てします
- 4 番目の項目を追加します - 余裕があるので、追加するだけです
- 5 番目のアイテムを追加 - スペースがないため、合計 8 アイテムのスペースを再割り当てします
- 等々...
また、CSimpleArray の初期サイズを指定する方法がないため、このパターンは常に発生します。
一方、CAtlArray では、SetCount( ) メソッドを使用して、割り当てられたメモリを一度に指定できます。上記と同じ例を使用して、項目を追加する前に SetCount(5) を呼び出します。そうすれば、常に 5 つのアイテムの余地があり、再割り当てを行う必要はありません。
したがって、質問に答えるには、メモリ管理に関心がある場合、特にパフォーマンスが心配な場合は CAtlArray を使用してください。リストにいくつかの項目を保持するだけで、リストが占有するメモリの管理方法を気にしない場合は、CSimpleArray を使用します。このコンテキストで「小さい」と「大きい」が何を意味するかについての具体的な質問に答えるために、「小さい」とは、長さが次の 2 の累乗を超えるたびに再割り当てしても問題ない要素が少ないことを意味します。
また、CSimpleArray では Find( ) メソッドを使用して配列を検索できますが、CAtlArray では検索できないことに注意してください。
(注: 私の回答は、ATL ソース コードを調べただけに基づいています。)