CArray 和内存预分配

Posted

技术标签:

【中文标题】CArray 和内存预分配【英文标题】:CArray and memory pre-allocation 【发布时间】:2015-03-19 19:49:38 【问题描述】:

我正在使用 MFC 项目中的代码,该项目使用 CArray 类来处理动态数组。它是这样工作的:

CArray<CUSTOM_STRUCT> arr;
while(some_criteria)

    CUSTOM_STRUCT cs;
    add.add(cs);

这种方法很有效,但是会因为大量添加到动态数组而变得非常缓慢。所以我很好奇,有没有办法在我开始调用 add() 方法之前在 CArray 中预分配内存?

但有一个警告。在进入我的 while() 循环之前,我只能大致估计数组中的元素数量。

附言。我不能使用除 CArray 之外的任何其他数组。

PS2。由于这个项目的复杂性,我更愿意通过 add() 方法来保持对数组的添加。

【问题讨论】:

【参考方案1】:

真的,真的考虑换成std::vector。这非常容易。

这是为了让CArray 遵循类似std::vector 的增长策略,而不是每次都遵循 1:

CArray<CUSTOM_STRUCT> arr;
while(some_criteria) 
  CUSTOM_STRUCT cs;
  arr.SetSize( arr.GetSize(), 1 + arr.GetSize()/2 );
  arr.add(cs);

当我遇到这个问题时,我将CArray 替换为std::vector,所以我没有测试上述内容。阅读文档,它应该可以工作。测试一下,看看你是否获得了巨大的性能提升(它应该从 O(n^2) 下降到 O(n) 摊销)。

【讨论】:

感谢您的信息。只是出于好奇,为什么std::vectorCArray 好很多? PS。我还在使用 Visual Studio 2008。 @c00000fd 例如,如果您使用std::vector 执行上述操作,它会正常工作,并且不会出现性能问题。我不是 CArray 专家,我只知道能够在需要时将其从代码库中删除(通常是出于维护(我们发现 std::vector 更易于使用)或性能原因)。 它是否仍可用于较旧的编译器/IDE,即 VS 2008? @c00000fd #include &lt;vector&gt;。这是值得学习的,但你第一次使用它不应该用它替换 CArray,我承认。 (它不是直接替代品)。 嘿,最后一个问题。你知道MFC的CString是否也受到同样的内存分配问题的影响?【参考方案2】:

使用CArray::SetSize()方法预分配内存。

请注意,如果内存是预先分配的,您应该使用CArray::operator[] 而不是CArray::Add 方法。

【讨论】:

以上是关于CArray 和内存预分配的主要内容,如果未能解决你的问题,请参考以下文章

在实时环境中使用 C++ 预分配内存

为动态数据结构预分配内存

如何为不断增长的 Eigen::MatrixXd 预分配内存

DPDK预分配了多少虚拟内存

为字符串向量预分配内存(C++ vector<string>)

在 .NET 应用程序中预分配(保证)内存