c++ - 清除 std::list 动态对象的最快方法是什么?

标签 c++ performance list stl

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

std::list<int *> m_ilist;

然后我将 int 添加到列表中:

m_ilist.push_back (new int (x));

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

哪个更好:

  1. 循环遍历列表,对每个迭代器调用删除。调用clear()之后:

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

    for (...) { delete *it; m_ilist.erase (); }
    

更好被定义为更快/更快/更少的处理。

谢谢。

最佳答案

对其进行基准测试。更重要的是,在您的特定应用程序中对其进行基准测试。当您的里程变化时,我们测试两个版本的综合运行时是没有意义的,这取决于您之后所做的事情。

瓶颈在于幕后发生的令人讨厌的释放和内存分配。根据程序其余部分所展示的内存分配模式,您很可能会得到不同的结果。

话虽如此;差异很可能可以忽略不计,因此我的直觉告诉我,如果有疑问,请进行第二次循环并保存一个循环。


编辑:请注意,如果您确实关心速度,请使用 std::vector<int>而不是std::list<int*> 。差异将明显大于您列出的选项之间的差异。

编辑 2:如果您使用 std::vector确保使用变体 1(使用 clear 而不是许多 erase )。在这种情况下,它确实会产生巨大的差异。如果元素确实很大(而不是 int ),您可能需要实际将指针(或智能指针)放入 vector 中以最小化复制开销。

关于c++ - 清除 std::list 动态对象的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9408644/

相关文章:

c++ - 内联函数 - 自动内联

c++ - 简单的 C++ 文件打开问题

javascript - 为什么内联脚本 > 外部样式表比外部样式表 > 脚本更快?

string - Python 将字符串列表转换为列表

android - Simple List Item Checked 在点击时检查多个项目

c++ - C++ 标准中的适配器是什么?它与适配器设计模式有何关系?

c++ - zlib 在缓冲区扩展时停止

c++ - Eigen 中的高效矩阵转置矩阵乘法

php - 我应该关闭 cURL 吗?

erlang - 粘合二进制文件(list_to_binary)有多贵?