C++ 模板表达式如何摆脱临时变量
我读了一些文章,其中很多提到表达式模板可以避免使用临时对象。但他们都没有提到如何做到这一点。据我所知,由于设计架构,操作是使用临时对象完成的。例如,如果a、b和c是两个矩阵,如果我们做C++ 模板表达式如何摆脱临时变量,c++,templates,temporary-objects,expression-templates,C++,Templates,Temporary Objects,Expression Templates,我读了一些文章,其中很多提到表达式模板可以避免使用临时对象。但他们都没有提到如何做到这一点。据我所知,由于设计架构,操作是使用临时对象完成的。例如,如果a、b和c是两个矩阵,如果我们做a=b+c,则b+c的结果保存在一个临时对象中,如temp=b+c,然后将结果复制回一个类似a=temp 但是如果我们使用表达式模板,那么这个加法(+)操作返回b和c的引用,然后在赋值运算符(=)被计算时,主计算发生。这是模板表达式的简单的一般概念。但我不明白它是如何摆脱临时对象的。如果有人能给出如何避免这种暂时性
a=b+c
,则b+c
的结果保存在一个临时对象中,如temp=b+c
,然后将结果复制回一个类似a=temp
但是如果我们使用表达式模板,那么这个加法(+)操作返回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
而这正是表达式模板在真正需要结果时才对expression进行评估的有效方法
请注意,临时结果(即c+d
的中间结果)是必需的,因为每个操作符+
分别在所有元素中循环。一旦分开的回路组合在一起,就不再需要临时回路
对于一个不那么业余的解释和更多的细节,我可以建议你这样做。以
Vector a,b,c,d;
a = b + c + d;
通常这会转化为
a = b.operator+( c.operator+(d) );
其中,对operator+
的每次调用都必须循环遍历条目。然而,更自然的方法是循环所有元素一次,然后做一些加法,比如
a_i = b_i + c_i + d_i
而这正是表达式模板在真正需要结果时才对expression进行评估的有效方法
请注意,临时结果(即c+d
的中间结果)是必需的,因为每个操作符+
分别在所有元素中循环。一旦分开的回路组合在一起,就不再需要临时回路
对于一个不太专业的解释和更多细节,我可以向您建议。您可能会发现一个相关但不重复的问题很有趣。您仍然会得到一个临时对象,但不是最终类型,您有一个临时包装器。您可能会发现一个相关但不重复的问题很有趣。您仍然会得到一个临时对象,但不是最终类型,您有一个临时包装器。