C++ 什么';清除动态对象列表的最快方法是什么?

C++ 什么';清除动态对象列表的最快方法是什么?,c++,performance,list,stl,C++,Performance,List,Stl,我有一个定义如下的列表: std::list<int *> m_ilist; 我想销毁向量并删除为每个元素分配的内存 哪一个更好: 在列表中执行循环,在每个迭代器上调用delete。在此调用clear()之后: 在迭代器上执行循环但调用擦除: for (...) { delete *it; m_ilist.erase (); } 更好的定义是更快/更快/更少的处理 谢谢。对它进行基准测试。更重要的是,在您的特定应用程序中对其进行基准测试。我们测试这两个版本的合成运行时是没有意

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

std::list<int *> m_ilist;
我想销毁向量并删除为每个元素分配的内存

哪一个更好:

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

  • 在迭代器上执行循环但调用擦除:

    for (...) { delete *it; m_ilist.erase (); }
    
  • 更好的定义是更快/更快/更少的处理


    谢谢。

    对它进行基准测试。更重要的是,在您的特定应用程序中对其进行基准测试。我们测试这两个版本的合成运行时是没有意义的,因为根据您之后的操作,您的里程数会有所不同

    瓶颈是在窗帘后面进行的令人讨厌的释放和破坏。根据程序其余部分显示的内存分配模式,您很可能会得到不同的结果

    话虽如此;这种差异很可能可以忽略不计,所以我的直觉告诉我,如果有疑问,就去第二个循环,保存一个循环


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


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

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

    您可以尝试将整数合并在一起。创建一个整数池,而不是分配和取消分配整数。这样,您就不必一次又一次地分配和取消分配内存,而需要自己进行管理(哪些整数已经在使用,哪些没有)。管理的复杂性取决于具体情况。在某些情况下,只需一个接一个地分发整数,并在最后删除所有整数就足够了。看看这个技巧对你的情况是否有帮助

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


    最后,发挥你的想象力。

    或使用/然后调用
    清除
    ?@JoachimPileborg:我没有看到这个问题中的C++11标记,因此这些会导致编译器错误。为什么要动态分配
    int
    s?除非你希望能够使用NULL作为哨兵值,并且不能使用任何合法的
    int
    值相反,这样做只会浪费时间和内存。即使你需要一个哨兵,使用boost的可选库或std::pair将更有效。然后你只需在完成后清除列表即可。@NicolBolas我们大多数人都认为“C++”意味着“最新的稳定/官方版本的C++”,就像上面讨论的所有其他技术一样。@Kos:C++11还没有完全从任何编译器供应商处获得,更不用说已经证明是稳定的。但是,Joachim的评论可能会受益于“(如果这些C++11功能可用,else boost或其他等效功能)”.谢谢-我们通常使用
    std::list
    主要是因为我们需要一个
    列表
    。顺便问一下,您实际使用具有强所有权的int的
    std::list
    的场景是什么,这实际上需要您持有引用而不是对象?我的意思是,我可以想象为什么
    列表
    而不是
    向量
    (因为您需要两个O(1)插入和维护顺序),但为什么不只是
    std::list
    ?简单地使用
    list
    。数据按到达的顺序放入(因此向后推),然后数据用户迭代所有数据(无需修改或随机访问)。上面使用的
    int
    只是一个例子。@user626201:是的,
    vector::erase
    会很慢,因为它必须移动后面的所有元素。对于
    vector
    ,您希望以后用
    clear()
    清空它。@user626201:注意,如果您知道(或者可以粗略猜测),您可以进一步改进.39s插入元素之前的元素数。请查看
    std::vector::reserve
    。在您的场景中,没有理由在
    std::vector
    上使用
    std::list
    !这也会使您的问题消失,因为对于vector,您必须使用版本1(如您的实验所示)+ 1的池建议;您可能想重新表述背景线程的想法,因为这基本上是GC,并且有很多可以用于C++的。谢谢-然而,用例是在一个嵌入式内存受限的系统中。因此,一旦数据结构关闭,所有的内存都需要被释放到其他进程中。谢谢。CAFXX。你能给我一些C++的例子吗?C++在第二个线程中删除它们。我喜欢这个想法,但是我对C++中的GC没有什么经验。
    for (...) { delete *it; } m_ilist.clear ();
    
    for (...) { delete *it; m_ilist.erase (); }