【发布时间】:2013-06-12 11:46:02
【问题描述】:
您能解释一下为什么使用以下代码(未优化)的计算时间存在如此大的差异。我怀疑 RVO 与 move-construction,但我不太确定。
一般来说,遇到这种情况时最好的做法是什么?初始化非 POD 数据时,循环中的自动声明是否被视为不好的做法?
在循环内使用 auto :
std::vector<int> foo()
{
return {1,2,3,4,5};
}
int main()
{
for (size_t i = 0; i < 1000000; ++i)
auto f = foo();
return 0;
}
输出:
./a.out 0.17s user 0.00s system 97% cpu 0.177 total
循环外的向量实例:
std::vector<int> foo()
{
return {1,2,3,4,5};
}
int main()
{
std::vector<int> f;
for (size_t i = 0; i < 1000000; ++i)
f = foo();
return 0;
}
输出:
./a.out 0.32s user 0.00s system 99% cpu 0.325 total
【问题讨论】:
-
在一个循环中有声明和初始化,而在另一个循环中只有一个赋值。这是故意的吗?如果您将橙子与橙子进行比较,您不应该在循环内移动
std::vector<int> f吗? -
如果您怀疑移动构造要快得多,请使用您自己的向量类,将移动构造函数转发给复制构造函数,然后再次测量。或者查看程序集,看看它在做什么。或者在你的类的复制/移动构造函数和赋值运算符中添加计数器,看看实际调用了什么。
-
另外:虚假基准警报。任何具有良好优化“技能”的编译器都可以优化所有循环
-
没有优化的“基准”毫无意义。
-
让我猜猜:您测量的是调试版本还是未优化版本?
标签: c++ loops optimization c++11 auto