C++:编译器是否优化整数 + 浮点算术运算?

标签 c++ optimization compilation floating-point integer

编译器是否有能力甚至能够优化一侧是整数类型而另一侧是 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。有时编译器可能能够推断出 fi 的值,即使它们是表达式或标识符,而不是常量,因为先前代码的流程必然会产生一些值,然后它可能能够根据推导出的值进行优化。

因此,可以识别特殊情况。我不希望编译器通常能够将 f + i 转换为任何类型的优化位旋转,这将比浮点加法(或编译器通常使用的任何指令)更快.然而,理论上,它可能会发生,如果是这样,设计良好的编译器应该优化 f + if + (float) i 相同。 (也许在软件而不是硬件中有支持浮点的 C 实现可能以比两个浮点值相加更快的方式处理浮点值和整数的相加。)

关于C++:编译器是否优化整数 + 浮点算术运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49225332/

相关文章:

c++ - GCC constexpr 允许添加,但不允许使用地址进行按位或

c++ - this 和成员函数的常量正确性

c++ - vector 比较失败

python - 使用 Tensorflow/PyTorch 加速自定义函数的最小化

c++ - 使用 C++ 创建跨平台程序

c++ - 从 '::size_t' 到 'int' 的转换需要缩小转换

python - 将计算值元素添加到多维 numpy 数组的快速方法

c - 是否应该在调用之前定义内联函数?

c - 如何使用 MinGW 编译代码

c++ - 使用 Qt 时,我是否必须在特定操作系统上才能针对特定操作系统进行编译?