编译器是否有能力甚至能够优化一侧是整数类型而另一侧是 float 的算术运算?或者在 100% 的情况下,整数会在执行操作之前被提升为 float ?
我问的原因是因为为了清楚起见,我喜欢自己执行 float 提升,但如果它保留了编译器可以利用的情况,我可能会停止这样做。
最佳答案
在编译器可以优化 float
和整数之间的加法的情况下,例如将 3.f + 1
优化为 4
我希望强制转换的存在不会影响编译器是否可以优化,而不是在运行时执行加法。
这是基于现代编译器工作方式的一般性陈述,并非逻辑上的必然。在编译器识别出一些 f + i
可以优化的情况下,对于一些 float
f
和一些整数 i
(可能是常量或表达式,而不仅仅是标识符),那么 f + (float) i
在编译器的分析中应该是等效的,并且应该接受相同的优化。
理解为什么会这样的一种方法是,在解析 f + i
时,编译器将识别 i
必须转换为 float
,它会在程序的内部表示中构造获取f
、获取i
、将i
转换为的语句float
,并添加它们。在分析f + (float) i
时,会构造相同的内部表示,所以这两个语句是等价的。
也就是说,我预计编译器可以优化的情况可能相当有限。编译器可能会识别特定情况,例如添加两个常量、将 float
零添加到整数,以及将整数零添加到 float
。有时编译器可能能够推断出 f
和 i
的值,即使它们是表达式或标识符,而不是常量,因为先前代码的流程必然会产生一些值,然后它可能能够根据推导出的值进行优化。
因此,可以识别特殊情况。我不希望编译器通常能够将 f + i
转换为任何类型的优化位旋转,这将比浮点加法(或编译器通常使用的任何指令)更快.然而,理论上,它可能会发生,如果是这样,设计良好的编译器应该优化 f + i
与 f + (float) i
相同。 (也许在软件而不是硬件中有支持浮点的 C 实现可能以比两个浮点值相加更快的方式处理浮点值和整数的相加。)
关于C++:编译器是否优化整数 + 浮点算术运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225332/