我知道将浮动内容(反之亦然)投入相当昂贵。但是,编译器是否在编译时自动为代码中的常量执行此操作?对于例如
之间有什么区别吗?float y = 123;
float x = 1 / y;
和
float y = 123.f;
float x = 1.f / y;
我看到一些代码执行后者,但我不确定它是用于优化还是安全问题(即只要确保除数是浮点,即使y恰好是int)。
我正在使用gcc(因为答案可能是特定于编译器的。)
此外,任何指向编译器可以和不能优化的列表的指针都将受到赞赏。谢谢!
答案 0 :(得分:2)
是的,编译器会自动进行转换。你的两个代码块完全相同。
这不是优化。关闭优化不会使编译器在可执行代码中包含int-to-float转换,除非它是非常质量差的实现。
这也不是为了安全。编译器从不做任何“以防万一”操作数恰好是不同的类型。编译器知道代码中所有内容的类型。如果更改变量的类型,则无论如何都会重新编译使用该变量的所有内容;编译器不会尝试保持其他所有内容不变,只是更新已更改的部分。
答案 1 :(得分:0)
是的,它肯定是这样的,所以这两个片段是等价的。唯一重要的是你分配给它的变量的类型。
答案 2 :(得分:0)
它确实依赖于编译器 - 有些实际上可能存储一个常量int,并在每次分配给float变量时将其转换。
答案 3 :(得分:0)
在某些情况下,编译器会将float转换为int,例如
float f;
if (f > 1) ...
在这种情况下,我发生了(Visual Studio 2008)编译器生成的代码等同于
if (int (f) > 1) ...