我有:
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;
}
Run Code Online (Sandbox Code Playgroud)
现在,在上面,"a + b + c + d"将导致3个临时DoubleVec的创建 - 是否有一种方法可以通过某种类型的模板魔术来优化它...即将其优化为某种东西相当于:
DoubleVec ans(a.size());
for(int i = 0; i < ans.size(); i++) ans[i] = a[i] + b[i] + c[i] + d[i];
Run Code Online (Sandbox Code Playgroud)
您可以假设所有DoubleVec都具有相同的元素数.
高级别的想法是在"+"上做一些模板魔术,"延迟计算"直到=,此时它会调查自己,嗯......我只是添加了数字,并且合成a [i] + b [i] + c [i] + d [i] ...而不是所有的临时.
谢谢!
jal*_*alf 14
是的,这正是表达模板(例如http://www.drdobbs.com/184401627或http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Expression-template)的用途.
想法是operator+返回某种代理对象,代表要评估的表达式树.然后operator=编写以获取这样的表达式树并立即对其进行评估,避免创建临时表,并应用可能适用的任何其他优化.
| 归档时间: |
|
| 查看次数: |
1229 次 |
| 最近记录: |