C ++会自动将const整数转换为浮点数吗?

时间:2009-09-14 06:28:04

标签: c++ optimization compiler-optimization

我知道将浮动内容(反之亦然)投入相当昂贵。但是,编译器是否在编译时自动为代码中的常量执行此操作?对于例如

之间有什么区别吗?
float y = 123;
float x = 1 / y;

float y = 123.f;
float x = 1.f / y;

我看到一些代码执行后者,但我不确定它是用于优化还是安全问题(即只要确保除数是浮点,即使y恰好是int)。

我正在使用gcc(因为答案可能是特定于编译器的。)

此外,任何指向编译器可以和不能优化的列表的指针都将受到赞赏。谢谢!

4 个答案:

答案 0 :(得分:2)

是的,编译器会自动进行转换。你的两个代码块完全相同。

这不是优化。关闭优化不会使编译器在可执行代码中包含int-to-float转换,除非它是非常质量差的实现。

这也不是为了安全。编译器从不做任何“以防万一”操作数恰好是不同的类型。编译器知道代码中所有内容的类型。如果更改变量的类型,则无论如何都会重新编译使用该变量的所有内容;编译器不会尝试保持其他所有内容不变,只是更新已更改的部分。

答案 1 :(得分:0)

是的,它肯定是这样的,所以这两个片段是等价的。唯一重要的是你分配给它的变量的类型。

答案 2 :(得分:0)

对于大多数编译器, float y = 123 float y = 123.f 的情况应该相同,但是 float x = 1 / y float x = 1.f / y 实际上会产生不同的结果。

它确实依赖于编译器 - 有些实际上可能存储一个常量int,并在每次分配给float变量时将其转换。

答案 3 :(得分:0)

在某些情况下,编译器会将float转换为int,例如

float f;
if (f > 1) ...

在这种情况下,我发生了(Visual Studio 2008)编译器生成的代码等同于

if (int (f) > 1) ...