清除std ::动态对象列表的最快方法是什么?

时间:2012-02-23 07:12:33

标签: c++ performance list stl

我有一个定义如下的列表:

std::list<int *> m_ilist;

我将int添加到列表中:

m_ilist.push_back (new int (x));

我想破坏向量并删除为每个元素分配的内存。

哪一个更好:

  1. 在列表中循环,在每个迭代器上调用delete。在此之后调用clear():

    for (...) { delete *it; } m_ilist.clear ();
    
  2. 执行循环但在迭代器上调用erase:

    for (...) { delete *it; m_ilist.erase (); }
    
  3. 更好将被定义为更快/更快/更少处理。

    感谢。

2 个答案:

答案 0 :(得分:1)

基准测试。更重要的是,在您的特定应用程序中对其进行基准测试。我们没有必要测试两个版本的合成运行时间,当你的里程 会有所不同时,这取决于你之后做的事情。

瓶颈是窗帘后面的令人讨厌的自由和摩托车。根据程序的其余部分显示的内存分配模式,您很可能会得到不同的结果。

说完了;差异很可能是微不足道的,所以我的直觉说第二个,如果有疑问则保存一个循环。


修改:请注意,如果您真的关心速度,请使用std::vector<int>代替std::list<int*>。差异将远大于您列出的选项之间的差异。

编辑2:如果您使用std::vector,请务必使用变体1(使用clear代替许多erase)。在这种情况下, 会产生巨大的差异。如果元素非常大(与int相反),您可能希望实际将指针(或智能指针)放入向量中以最小化复制开销。

答案 1 :(得分:1)

最快的方法是根本不删除它。这可能是一个奇怪的答案,但有一些方法可以不删除它,但仍然没有内存泄漏。

您可以尝试汇总整数。不是分配和取消分配整数,而是创建一个整数池。这样可以省去一次又一次地分配和释放内存,但代价是进行自己的管理(整数已经在使用,而不是这样)。这种管理的复杂程度取决于具体情况。在某些情况下,只需逐个分发整数就足够了,并在最后删除所有整数。看看这个技巧在你的情况下是否有帮助。

您也可以尝试不清理主线程中的列表,但是在单独的线程中。在应用程序的开头启动一个“清理线程”,当需要清理列表时,将列表传递给另一个线程(使用事件,关键部分和队列将列表从主线程传递到清理现在,清理线程可以清理列表并释放内存,同时主线程继续运行,执行重要的事情。

最后,运用你的想象力。

相关问题