作者:孜雪颖2000 | 来源:互联网 | 2022-12-24 18:36
编译器是否有权甚至能够优化算术运算,其中一方是整数类型,而另一方是浮点数?或者,在100%的情况下执行操作之前,整数是否会被提升为浮点数?
我问的原因是因为我喜欢为了清晰起见而自己执行浮动促销,但如果它保留了编译器可以利用的情况,我可能会停止这样做.
1> Eric Postpis..:
在其中编译器可以优化之间的加成情况下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
整数添加零,以及向a添加整数零float
.有时编译器可能能够推导出值f
,i
即使它们是表达式或标识符,而不是常量,因为先前代码的流必然产生一些值,然后它可能能够根据推导的值进行优化.
因此,可以识别特殊情况.我不希望编译器能够通常f + i
变成任何类型的优化位 - 比浮点加法(或编译器通常使用的任何指令)更快.然而,从理论上讲,它可能会发生,如果是这样,一个设计良好的编译器应该优化f + i
相同的f + (float) i
.(也许有一些C实现在软件中支持浮点支持,而不是硬件,它可以以比添加两个浮点值的更快的方式处理浮点值和整数的添加.)