优化分配的模板技巧

ano*_*non 11 c++

我有:

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/184401627http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Expression-template)的用途.

想法是operator+返回某种代理对象,代表要评估的表达式树.然后operator=编写以获取这样的表达式树并立即对其进行评估,避免创建临时表,并应用可能适用的任何其他优化.