模板表达式如何摆脱临时

How template expressions get rid of temporaries

本文关键字:何摆脱 表达式      更新时间:2023-10-16

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

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

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+单独循环遍历所有元素。一旦单独的循环组合在一起,就不再需要临时的了。

对于不那么业余的解释和更多细节,我可以推荐你这个来自CppConf 2015的演讲。