【发布时间】:2010-09-22 21:17:57
【问题描述】:
文档说 CSimpleArray 用于处理少量对象。在这种情况下什么是小? CSimpleArray 是一个不错的选择,还是我应该始终使用不同的集合类,例如 CAtlArray?
【问题讨论】:
文档说 CSimpleArray 用于处理少量对象。在这种情况下什么是小? CSimpleArray 是一个不错的选择,还是我应该始终使用不同的集合类,例如 CAtlArray?
【问题讨论】:
这里的“小”是一个经验法则,它源于两个类在内部管理其内存的方式。基本上,CAtlArray 对其使用的内存提供了更细粒度的控制,而 CSimpleArray 简单而天真地处理内存。
具体来说,当一个元素被添加到一个 CSimpleArray 中时,如果该数组已经使用了它分配的所有内存,它将使其大小翻倍,这是一个相当昂贵的操作。一个新创建的 CSimpleArray 将以 0 个项目的空间开始。因此,假设您想将 5 个东西添加到数组中。它看起来像这样:
还要注意,没有办法指定 CSimpleArray 的初始大小,所以这种模式总是会发生。
另一方面,CAtlArray 允许您通过 SetCount( ) 方法一次性指定所有分配的内存。使用与上述相同的示例,在添加项目之前,调用 SetCount(5)。那么总会有 5 个项目的空间,无需重新分配。
所以回答这个问题:如果您关心内存管理,请使用 CAtlArray,特别是如果您担心性能问题。如果您只想在列表中保留一些项目而不关心列表占用的内存是如何管理的,请使用 CSimpleArray。要回答有关“小”和“大”在这种情况下是什么意思的具体问题,“小”意味着元素足够少,每次长度超过 2 的下一个幂时,您都可以重新分配。
还值得注意的是,CSimpleArray 允许您使用 Find() 方法搜索 Array,而 CAtlArray 不能。
(注意:我的回答仅基于查看 ATL 源代码。)
【讨论】: