C++11 按 POD 类型的值传递比常量引用差



这个问题不是关于通过值或引用传递大型对象 - 也不是关于移动语义 - 就像许多其他问题一样。

我想知道 POD 类型必须有多小,以便按值而不是常量引用传递它是一个更好的主意。我写了以下代码:

#include <ctime>
#include <iostream>
#include <complex>
using namespace std;
using Number = double; //complex<double>;
struct acc {
Number a;
void f(const Number& x) { a += x; }
void g(Number x) { a += x; }
};
int main()
{
int n = 1000000000;
Number *v = new Number[n];
for (int i = 0; i < n; i++) {
v[i] = Number(i);
}
clock_t b, e;
acc foo;
#ifdef _const
b = clock();
for (int i = 0; i < n; i++)
foo.f(v[i]);
e = clock();
cout << ((double) e - b) / CLOCKS_PER_SEC << endl;
#else
b = clock();
for (int i = 0; i < n; i++)
foo.g(v[i]);
e = clock();
cout << ((double) e - b) / CLOCKS_PER_SEC << endl;
#endif
cout << foo.a << endl;
return 0;
}

我用 gcc 编译而没有优化。

当使用数字=复杂时,常量引用更快,我有点期望。但是当使用 Number = double 时,常量引用传递也更快,这让我完全感到惊讶(在我的计算机中,按值传递是 3.5,常量引用是 2.9(。

这是为什么呢?在这样一个简单的例子中,工作量(包括内存访问(不是一样吗?我必须编写一个模板库,我想小心并根据模板参数的大小使用 const 引用或按值传递,但现在我认为担心这一点是没有用的。还有人知道发生了什么吗?

如果我使用优化进行编译,那么这两个品种的运行速度都一样快。

编译器编写者并不关心未优化的玩具代码在一种类似情况下是否比另一种情况慢 20%。 这就是原因。

你也不应该,除非你处于一个极端的极端情况,你需要你的调试版本足够快,以满足一些软实时要求(比如,每 X Hz 完成一次渲染,或者在网络连接的另一端超时之前处理数据(,并且 20% 的速度减慢是关键路径。

最新更新