什么更快:重新创建或清除()?

时间:2011-09-08 16:06:16

标签: c++ vector

我对std :: vector<>的性能有疑问在C ++中。通过调用clear()方法重用相同的向量是否更快,或者更快地重新创建向量?

以下示例不是现实生活中的代码,只是为了明确问题所在:

//Example ONE: is this faster
std::vector<int> foo;
for(int i = 0; i < 100; ++i)
{
    foo.clear();
    for(int j = 0; j < 100; ++j)
    {
        foo.push_back(i+j);
    }
}

//Example TWO: or is that faster?
for(int i = 0; i < 100; ++i)
{
    std::vector<int> foo;
    for(int j = 0; j < 100; ++j)
    {
        foo.push_back(i+j);
    }
}

7 个答案:

答案 0 :(得分:8)

clear()不能通过合约取消分配vector内存,而只是将内部“大小”标记设置为0,这样该方法会更快。

答案 1 :(得分:2)

这取决于您正在使用的C ++标准库中std::vector的实现,但第一种情况可能会更快,因为大多数实现在您调用{{{{}}时实际上并不释放已分配的内存1}}。因此,第一次执行内循环后,第一个不执行重复分配。

答案 2 :(得分:1)

是。不,第一个可能更快。这取决于。唯一有用的答案来自您在自己的环境中分析自己的代码。

尝试分析您的代码,看看会发生什么。编译your program at ideone表明,对于一个特定的编译器/ os / machine / run,你的第一个例子快4倍。

this program显示了一个中间解决方案,对于这个特定的编译器/ os / machine / run,它比#2快,比#1慢。

答案 3 :(得分:0)

示例2为std :: vector内部的数组重复了堆分配。示例1更快,因为它避免在堆上重复分配内存,除非需要在内部调整向量。

答案 4 :(得分:0)

您必须为编译器运行基准测试。 clear()和'allocate'方法取决于实现。

答案 5 :(得分:0)

要同时清除向量并降低其实施最低容量,Scott Meyers建议交换技巧

std::vector<int>().swap( foo );

使用手动循环迭代矢量以恢复其内容也会更快。

答案 6 :(得分:0)

在这种特定情况下,大多数机器上的重用情况可能会更快。您正在存储不需要销毁的原始数据(甚至包含析构函数)。另一方面,如果向量包含非POD对象,则调用clear将破坏每个元素。第三方面,所有累积的数据最终都需要被破坏。