I have:
struct DoubleVec {
std::vector<double> data;
};
DoubleVec operator+(const DoubleVec& lhs, const DoubleVec& rhs) {
DoubleVec ans(lhs.size());
for(int i = 0; i < lhs.size(); ++i) {
ans[i] = lhs[i]] + rhs[i]; // Assume lhs.size() == rhs.size()
}
return ans;
}
DoubleVec someFunc(DoubleVec a, DoubleVec b, DoubleVec c, DoubleVec d) {
DoubleVec ans = a + b + c + d;
}
现在,在上面,“a + b + c + d”将导致创建三个临时 DoubleVec。有没有办法通过某种类型的模板魔法来优化它?即,将其优化为相当于:
DoubleVec ans(a.size());
for(int i = 0; i < ans.size(); i++)
ans[i] = a[i] + b[i] + c[i] + d[i];
您可以假设所有 DoubleVec 具有相同数量的元素。
高层次的想法是对“+”进行某种类型的模板化魔法,这“延迟计算”直到=,此时它会审视自身,嗯……我只是将这些数字相加,然后合成 a[i] + b[i] + c[i] + d[i] ... 而不是所有临时变量。
是的,就是这样表达模板 (see http://www.drdobbs.com/184401627 http://www.drdobbs.com/184401627 or http://en.wikibooks.org/wiki/More_C%2B%2B 习语/Expression-template http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Expression-template例如)是为了。
我们的想法是让operator+
返回某种代表要评估的表达式树的代理对象。然后operator=
编写为采用这样的表达式树并立即对其进行评估,避免创建临时变量,并应用任何其他可能适用的优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)