この質問は値や参照によって大きなオブジェクトを渡すことではなく、他の多くの質問と同様に移動セマンティクスではありません。C++ 11はconst参照よりも悪いPOD型の値渡し
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参照が高速になり、少し期待しました。しかし、const参照の受け渡しは、Number = doubleを使用するとさらに速くなりました。これは私を完全に驚かせるものでした(私のコンピュータでは、値渡しでは3.5、const参照では2.9でした)。
これはなぜですか?このような単純な例では、メモリアクセスを含む作業量は同じではありませんか?私はテンプレートライブラリを書く必要があり、テンプレート引数のサイズに応じてconst参照や値渡しを慎重に使いたいと思っていましたが、今は心配するのは無駄です。他の誰もが何が起こっているか考えている?
私が最適化でコンパイルすると、両方の品種が同等に高速に実行されます。
"* gccで最適化せずにコンパイルしました。*"これは問題です。最適化されていないコードの相対的なパフォーマンスを心配するにはあまり時間を費やす価値はありません。 – juanchopanza
"最適化でコンパイルすると、両方の品種が同じ速度で実行されます。" あなたは何をしたいですか? – DaOnlyOwner
私はこの質問を閉じるに投票します。なぜなら、識別可能な問題については尋ねないからです。 –