模板表达式如何摆脱临时
How template expressions get rid of temporaries
我正在阅读一些文章,其中许多文章都提到了表达式模板可以避免使用临时对象。但他们都没有提到这是如何做到的。据我所知,由于设计架构操作是使用临时对象完成的。例如,如果 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的演讲。
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 提升精神:解析布尔表达式并简化为规范范式
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 使用正则表达式regex_search在字符串中查找字符串
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 概念中的cv限定符需要表达式参数列表
- 为什么constexpr的性能比正常表达式差
- Python中的for循环与C++有何不同
- 对于结构,表达式必须是可修改的ivalue
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 将fold表达式与std::一起用于两个元组
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 标记 '","' 之前的预期主表达式
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 带有用户定义类的c++折叠表达式
- C++ 和 Java 之间的表达式求值顺序有何不同
- 模板表达式如何摆脱临时