【发布时间】:2018-08-19 21:20:01
【问题描述】:
编译器是否有能力甚至能够优化一侧是整数类型而另一侧是浮点数的算术运算?还是会在 100% 的情况下将整数提升为浮点数,然后再执行操作?
我问的原因是因为为了清楚起见,我喜欢自己执行浮动提升,但如果它保留了编译器可以利用的情况,我可能会停止这样做。
【问题讨论】:
-
整数隐式转换为
float的问题由标准回答,与优化无关 -
@UnholySheep:这个问题是有道理的,你的陈述并没有说明答案。虽然标准要求在抽象模型中将整数转换为浮点数,但编译器可以对加法执行某种优化,只要它得到相同的答案。所以这个问题本质上是问是否明确包括一个演员会阻止这种优化。
-
x86 可以直接操作 float,int 操作数,例如
FIADD。演员表是不必要的,可能会影响性能。 -
@stark:演员阵容如何影响表演?如果得到与 C 要求相同的结果,编译器可以使用
FIADD来添加浮点数和整数。 C 要求将整数转换为浮点数。因此,根据 C 标准,f + i和f + (float) i必须具有相同的结果。因此,如果编译器在一种情况下可以使用FIADD,那么它可以在另一种情况下使用它。 -
因为如果按字面意思执行,它会先转换为浮点数,然后再进行浮点数相加。这是 x86 上的两条指令对比一条。
标签: c++ optimization compilation floating-point integer