C ++ 11传递POD类型的值比const引用更差

时间:2017-07-10 19:58:46

标签: c++ c++11 pass-by-reference pass-by-value

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

我想知道POD类型必须有多小,以便通过值而不是const引用传递它更好。我写了以下代码:

#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 = complex时,const引用更快,我预计会有一点。但是当使用Number = double时,传递const引用也更快,这让我感到惊讶(在我的计算机中,传值为3.5,const引用为2.9)。

这是为什么?在这么简单的例子中,工作量,包括内存访问量是否相同?我必须编写一个模板库,我想小心并根据模板参数的大小使用const引用或pass-by-value,但现在我认为担心这一点是没有用的。其他人都知道发生了什么事吗?

如果我使用优化进行编译,那么两个变种的运行速度都相同。

1 个答案:

答案 0 :(得分:3)

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

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