我正在编写一个 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
's 的内存稍后用于输出,所以它赢了'不被编译器的 RVO 使用。