每次重新使用容器或声明新容器

时间:2013-02-28 19:44:20

标签: c++ performance stl

假设您需要多次使用STL容器(set,map,queue)。哪种一般方法会更好?

  1. 每次创建容器。
  2. 每次使用相同的全局对象,但要花些时间清除它。
  3. // Option 1
    void foo()
    {
        set<int> S; //creating a new S each time foo is called.
    
        //use S...
    }
    
    // Option 2
    set<int> S;
    void foo()
    {
        S.clear();
    
        //use S...
    }
    

2 个答案:

答案 0 :(得分:3)

在没有进行性能测试的情况下,我会告诉您,选项2(重用)稍微更快是直观的,因为您每次都不构建和销毁容器。当你破坏容器时,它必然会清除它,否则会有内存泄漏。

但是,进行性能测试会产生不同的结果:

  • 对于std :: list,似乎clear需要更长时间 析构函数。
  • 对于std :: set,结果几乎相同。
  • 对于std :: map,结果很接近,但是选项1(析构函数)是 稍快一点。
  • 对于std :: vector,结果类似于list(尽管向量总体上要快得多)

总的来说,看来option1稍快一点。我和VS2012,YMMV一起跑步

答案 1 :(得分:0)

假设您不必处理多线程问题,案例2可能更好。主要是因为一些标准的lib容器清除了避免内存分配。具体来看std::vector's clear function的文档。

Clear不会导致内存重新分配,向量的容量不变。