运算符重载关联性编译器优化

时间:2018-03-30 23:53:31

标签: c++ operator-overloading operators compiler-optimization associativity

我不熟悉C ++中如何定义加法运算符和乘法运算符的细节,而且我也不知道编译器可用或不可用的信息来优化低效的订单操作

让我们说我们有一个矩阵数据类型,它通过标量实现元素乘法(即用标量缩放矩阵)。如果我们有以下代码段:

Matrix a;
float b = /* value set at runtime */;
float c = /* value set at runtime */;
a = a * b * c;

如果我们从左到右天真评估此表达式,我们会先按a缩放b,然后按c进行缩放,而不是按a缩放b cuser_name的产品。编译器是否能够选择后者 (更有效)的行为而不是前者?

1 个答案:

答案 0 :(得分:3)

对Godbolt的一些实验似乎发现,最新版本的GCC和Clang为a * b * c生成的代码与(a * b) * c生成的代码相同,长度超过a * (b * c)生成的代码因此,似乎没有,编译器不够聪明,无法执行您所询问的优化。

您可以自己将b * c括起来。更复杂的解决方案是让*运算符生成将在评估之前进行优化的表达式模板,因此即使用户键入(a * b) * c,您的库也会在评估之前将其重新排列为a * (b * c)