我有:

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”将导致创建3个临时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] ...而不是所有临时图像。

谢谢!

最佳答案

是的,这正是表达式模板的用途(例如,参见http://www.drdobbs.com/184401627http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Expression-template)。

这个想法是使operator+返回某种代理对象,该代理对象代表要评估的表达式树。然后,将operator=编写为采用这样的表达式树并立即对其全部求值,避免创建临时对象,并应用可能适用的任何其他优化。

09-06 11:27