我正在寫一個ODE集成器,它在每個步驟評估dy/dx,之後不需要它。似乎只分配空間會更快,只是使用該空間,以便我不花時間分配新的dydx向量。編譯器會優化這個嗎 換句話說,哪一個更好?返回一個向量或傳遞參考
1)
vector<double> dydx(const vector<double>&x) {
vector<double> dydx_tmp(x.size());
for(size_t i = 0; i < x.size()/2; ++i) {
dydx_tmp[2*i] = -x[2*i+1];
dydx_tmp[2*i+1] = x[2*i];
}
return dydx_tmp;
}
或 2),其中dydx已經被分配,只是需要更新
void update_dydx(vector<double> & dydx, const vector<double> &x) {
for(size_t i = 0; i < x.size()/2; ++i) {
dydx[2*i] = -x[2*i+1];
dydx[2*i+1] = x[2*i];
}
}
還有的 3)
vector<double> dydx_by_v(vector<double> x) {
vector<double> dydx_tmp(x.size());
for(size_t i = 0; i < x.size()/2; ++i) {
dydx_tmp[2*i] = -x[2*i+1];
dydx_tmp[2*i+1] = x[2*i];
}
return dydx_tmp;
}
的情況下
後面http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/但在這種情況下,它不'因爲x
的內存稍後用於輸出,所以它不會被編譯器的RVO使用。
你的矢量真的只是兩個浮點數嗎? – delnan
@delnan它的範圍從2到數千,它可以是編譯或運行時參數。該操作在整個向量上。我只是試圖保持它簡單 –
我編輯我的答案以迴應你的編輯 – aryjczyk