模板表达式如何摆脱临时表演

时间:2016-07-10 09:04:56

标签: c++ templates temporary-objects expression-templates

我正在阅读一些文章,其中许多提到表达模板可以避免使用临时对象。但他们都没有提到如何做到这一点。据我所知,由于设计架构操作是使用临时对象完成的。例如,如果a,b和c是两个矩阵,如果我们a = b+c,那么b+c的结果将保存在temp = b+c之类的临时对象中,然后将结果复制回比如a = temp

但是如果我们使用表达式模板,那么这个加法(+)操作返回b和c的引用,然后在计算赋值运算符(=)时进行主计算。这是模板表达式的简单概括。但我不明白它如何摆脱临时对象。如果有人能够提供如何避免这种临时性的一般想法,那将是很好的。

1 个答案:

答案 0 :(得分:2)

为例
Vector a,b,c,d;
a = b + c + d;

通常这会转化为

a = b.operator+( c.operator+(d) );

每次调用operator+都必须遍历条目。然而,更自然的方式是遍历所有元素一次并做一些添加,如

a_i = b_i + c_i + d_i

这就是表达模板通过仅在真正需要结果时评估epxression有效地做什么。

请注意,仅需要临时(即c+d的中间结果),因为每个operator+单独循环遍历所有元素。一旦合并了单独的循环,就不再需要临时循环了。

对于不那么业余的解释和更多细节,我可以建议你talk from the CppConf 2015