【问题标题】:In what situations is the ATL CSimpleArray a better choice than CAtlArray在什么情况下,ATL CSimpleArray 是比 CAtlArray 更好的选择
【发布时间】:2010-09-22 21:17:57
【问题描述】:

文档说 CSimpleArray 用于处理少量对象。在这种情况下什么是小? CSimpleArray 是一个不错的选择,还是我应该始终使用不同的集合类,例如 CAtlArray?

【问题讨论】:

    标签: arrays atl


    【解决方案1】:

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

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

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

    还要注意,没有办法指定 CSimpleArray 的初始大小,所以这种模式总是会发生。

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

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

    还值得注意的是,CSimpleArray 允许您使用 Find() 方法搜索 Array,而 CAtlArray 不能。

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

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 2017-05-08
      • 1970-01-01
      • 2011-11-04
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      相关资源
      最近更新 更多