我不熟悉C ++中如何定义加法运算符和乘法运算符的细节,而且我也不知道编译器可用或不可用的信息来优化低效的订单操作
让我们说我们有一个矩阵数据类型,它通过标量实现元素乘法(即用标量缩放矩阵)。如果我们有以下代码段:
Matrix a;
float b = /* value set at runtime */;
float c = /* value set at runtime */;
a = a * b * c;
如果我们从左到右天真评估此表达式,我们会先按a
缩放b
,然后按c
进行缩放,而不是按a
缩放b
c
和user_name
的产品。编译器是否能够选择后者
(更有效)的行为而不是前者?
答案 0 :(得分:3)
对Godbolt的一些实验似乎发现,最新版本的GCC和Clang为a * b * c
生成的代码与(a * b) * c
生成的代码相同,长度超过a * (b * c)
生成的代码因此,似乎没有,编译器不够聪明,无法执行您所询问的优化。
您可以自己将b * c
括起来。更复杂的解决方案是让*
运算符生成将在评估之前进行优化的表达式模板,因此即使用户键入(a * b) * c
,您的库也会在评估之前将其重新排列为a * (b * c)