- arrays/
- Arrays 在什么情况下,ATL CSIMPLE阵列是比CAtlArray更好的选择
Arrays 在什么情况下,ATL CSIMPLE阵列是比CAtlArray更好的选择
Arrays 在什么情况下,ATL CSIMPLE阵列是比CAtlArray更好的选择,arrays,atl,Arrays,Atl,文档中说CSimpleArray用于处理少量对象。在这种情况下,什么是小的?CSimpleArray是一个不错的选择,还是应该始终使用不同的集合类,如CAtlArray?“小”这里有一条经验法则,它源于这两个类在内部管理内存的方式。基本上,CAtlArray对其使用的内存提供了更细粒度的控制,而CSimpleArray简单而朴素地处理内存
具体地说,当一个元素被添加到CSimpleArray时,如果该数组已经使用了它分配的所有内存,那么它的大小将翻倍,这是一个相当昂贵的操作。新创建的CSimpl
文档中说CSimpleArray用于处理少量对象。在这种情况下,什么是小的?CSimpleArray是一个不错的选择,还是应该始终使用不同的集合类,如CAtlArray?“小”这里有一条经验法则,它源于这两个类在内部管理内存的方式。基本上,CAtlArray对其使用的内存提供了更细粒度的控制,而CSimpleArray简单而朴素地处理内存
具体地说,当一个元素被添加到CSimpleArray时,如果该数组已经使用了它分配的所有内存,那么它的大小将翻倍,这是一个相当昂贵的操作。新创建的CSimpleArray将以0个项目的空间开始。假设你想在一个数组中添加5个元素。它将如下所示:
- 添加第一项-没有空间,因此重新分配总共1项的空间
- 添加第二项-没有空间,因此重新分配总共2项的空间
- 添加第三项-没有空间,因此重新分配总共4项的空间
- 添加第四项-有空间,所以只需添加
- 添加第5项-没有空间,因此重新分配总共8项的空间
- 等等
还要注意的是,没有办法指定CSimpleArray的初始大小,因此这种模式总是会发生
另一方面,CAtlArray允许您通过SetCount()方法一次性指定分配的内存。使用与上面相同的示例,在添加项目之前,调用SetCount(5)。然后将始终有5个项目的空间,无需重新分配
所以要回答这个问题:如果你关心内存管理,尤其是担心性能的话,就使用CAtlArray。如果您只想在列表中保留一些项,而不关心如何管理列表占用的内存,请使用CSimpleArray。为了回答关于“小”和“大”在本文中的含义的具体问题,“小”意味着足够少的元素,您可以在每次长度超过2的下一次幂时重新分配
还值得注意的是,CSimpleArray允许您使用Find()方法搜索数组,而CAtlArray不允许
(注意:我的答案仅基于查看ATL源代码。)这里有一条经验法则,它源于两个类内部管理内存的方式。基本上,CAtlArray对其使用的内存提供了更细粒度的控制,而CSimpleArray简单而朴素地处理内存
具体地说,当一个元素被添加到CSimpleArray时,如果该数组已经使用了它分配的所有内存,那么它的大小将翻倍,这是一个相当昂贵的操作。新创建的CSimpleArray将以0个项目的空间开始。假设你想在一个数组中添加5个元素。它将如下所示:
- 添加第一项-没有空间,因此重新分配总共1项的空间
- 添加第二项-没有空间,因此重新分配总共2项的空间
- 添加第三项-没有空间,因此重新分配总共4项的空间
- 添加第四项-有空间,所以只需添加
- 添加第5项-没有空间,因此重新分配总共8项的空间
- 等等
还要注意的是,没有办法指定CSimpleArray的初始大小,因此这种模式总是会发生
另一方面,CAtlArray允许您通过SetCount()方法一次性指定分配的内存。使用与上面相同的示例,在添加项目之前,调用SetCount(5)。然后将始终有5个项目的空间,无需重新分配
所以要回答这个问题:如果你关心内存管理,尤其是担心性能的话,就使用CAtlArray。如果您只想在列表中保留一些项,而不关心如何管理列表占用的内存,请使用CSimpleArray。为了回答关于“小”和“大”在本文中的含义的具体问题,“小”意味着足够少的元素,您可以在每次长度超过2的下一次幂时重新分配
还值得注意的是,CSimpleArray允许您使用Find()方法搜索数组,而CAtlArray不允许
(注意:我的答案仅基于查看ATL源代码。)