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