在什么情况下ATL CSimpleArray比CAtlArray更好

时间:2008-11-18 15:59:16

标签: arrays atl

文档说CSimpleArray用于处理少量对象。这方面有什么小事? CSimpleArray是一个不错的选择,还是应该总是使用不同的集合类,如CAtlArray?

1 个答案:

答案 0 :(得分:1)

“小”这里是一个经验法则,它源于两个类在内部管理内存的方式。基本上,CAtlArray对它使用的内存提供了更细粒度的控制,而CSimpleArray简单但天真地处理内存。

具体来说,当一个元素被添加到CSimpleArray时,如果该数组已经使用了它已分配的所有内存,它将使其大小加倍,这是一个相当昂贵的操作。新创建的CSimpleArray将以0项的空间开始。所以我们假设你要为数组添加5个东西。它看起来像这样:

  • 添加第1项 - 没有空间,因此总共为1个项目重新分配空间
  • 添加第2项 - 没有空间,因此总共为2个项目重新分配空间
  • 添加第3项 - 没有空间,因此总共为4个项目重新分配空间
  • 添加第4项 - 有空间,所以只需添加
  • 添加第5项 - 没有空间,因此总共为8个项目重新分配空间
  • 等......

另请注意,无法指定CSimpleArray的初始大小,因此这个模式总会发生。

另一方面,CAtlArray允许您通过SetCount()方法一次性指定分配的内存。使用与上面相同的示例,在添加项目之前,请调用SetCount(5)。然后总会有5个项目的空间,不需要重新分配。

所以回答这个问题:如果你关心内存管理,请使用CAtlArray,特别是如果你担心性能不佳。如果您只想在列表中保留一些项目而不关心列表占用的内存是如何管理的,请使用CSimpleArray。要回答关于“小”和“大”在这种情况下意味着什么的具体问题,“小”意味着足够少的元素,每当长度超过下一个2的幂时,你可以重新分配。

值得注意的是,CSimpleArray允许您使用Find()方法搜索数组,而CAtlArray则不会。

(注意:我的答案仅基于查看ATL源代码。)