這個問題不是關於通過值或引用傳遞大對象 - 也不是移動語義 - 就像許多其他問題一樣。C++ 11通過POD類型值比const引用更差
我想知道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引用或傳遞值,但現在我認爲這樣做是沒用的。其他人有什麼想法是怎麼回事?
如果我編譯優化,那麼兩個品種運行同樣快。
「*我用gcc編譯沒有優化。*」這是問題所在。不值得花費太多時間來擔心未優化代碼的相對性能。 – juanchopanza
「如果我通過優化進行編譯,那麼這兩個品種的運行速度都是相同的。」 那麼你想要什麼? – DaOnlyOwner
我投票結束這個問題,因爲它沒有問任何明顯的問題。 –