Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板表达式如何摆脱临时变量_C++_Templates_Temporary Objects_Expression Templates - Fatal编程技术网

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是两个矩阵,如果我们做
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
的中间结果)是必需的,因为每个
操作符+
分别在所有元素中循环。一旦分开的回路组合在一起,就不再需要临时回路


对于一个不太专业的解释和更多细节,我可以向您建议。

您可能会发现一个相关但不重复的问题很有趣。您仍然会得到一个临时对象,但不是最终类型,您有一个临时包装器。您可能会发现一个相关但不重复的问题很有趣。您仍然会得到一个临时对象,但不是最终类型,您有一个临时包装器。