模板表达式如何摆脱临时变量
How template expressions get rid of temporaries
我看了一些文章,其中很多都提到表达式模板可以避免使用临时对象。但其中 none 提到了这是如何完成的。据我所知,由于设计架构操作是使用临时对象完成的。例如,如果 a、b 和 c 是两个矩阵,如果我们执行 a = b+c
,那么 b+c
的结果将保存在一个临时对象中,例如 temp = b+c
,然后将结果复制回 a喜欢 a = temp
。
但是,如果我们使用表达式模板,那么这个加法 (+) 操作 returns 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
这就是表达式模板通过仅在真正需要结果时才评估表达式有效地执行的操作。
请注意,临时(即 c+d
的中间结果)是必需的,因为每个 operator+
单独循环遍历所有元素。一旦将单独的循环组合在一起,就不再需要临时的了。
为了不那么业余的解释和更多细节,我可以向您推荐这个 talk from the CppConf 2015。
我看了一些文章,其中很多都提到表达式模板可以避免使用临时对象。但其中 none 提到了这是如何完成的。据我所知,由于设计架构操作是使用临时对象完成的。例如,如果 a、b 和 c 是两个矩阵,如果我们执行 a = b+c
,那么 b+c
的结果将保存在一个临时对象中,例如 temp = b+c
,然后将结果复制回 a喜欢 a = temp
。
但是,如果我们使用表达式模板,那么这个加法 (+) 操作 returns 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
这就是表达式模板通过仅在真正需要结果时才评估表达式有效地执行的操作。
请注意,临时(即 c+d
的中间结果)是必需的,因为每个 operator+
单独循环遍历所有元素。一旦将单独的循环组合在一起,就不再需要临时的了。
为了不那么业余的解释和更多细节,我可以向您推荐这个 talk from the CppConf 2015。