vla*_*sch 1 c floating-point compiler-optimization
可疑的代码如下:
float32_t f = someValueFromSomewhere;
f = f * 4;
Run Code Online (Sandbox Code Playgroud)
编译器会优化这个吗?根据C-Standard(如果我理解正确的话),必须将第二个操作数提升为float32_t; 因此,乘法必须使用FPU(或fp仿真)完成.
从理论上讲,只需添加一个立即(可能是溢出检查),就可以在普通硬件寄存器中完成操作.编译器是否允许进行此优化?是否有编译器可以这样做?如果是这样,他们也会认出这个表达
f = f * 4.0f;
Run Code Online (Sandbox Code Playgroud)
这是避免静态代码检查器有关隐式转换的警告所必需的吗?
一些补充:我知道从标准的角度来看两条线都是等价的.但显然编译器可以区分它们.所以问题是在哪个时候允许优化器第一次看到代码(或更好的内部表示).
如果原始值不是一个次正规值(包括公共零),不是无穷大或NaN,并且结果没有溢出,则将2加到指数而不是乘以4.0.通常,编译器没有此信息.当编译器确实拥有此信息时,允许进行此转换,这并不意味着它是一个好主意.
除非你想到一个特定的执行平台,从中获取f浮点寄存器的值会更便宜,将它移到通用寄存器中,添加一个常量,测试特殊情况(见上文),并且返回到浮点寄存器,您可以假设所有这些步骤都比浮点乘法更昂贵.只有当浮点运算被模拟为一系列位和整数运算时才有意义以这种方式"乘以2"的乘法.
f = f * 4.0f;f * 4相当于f * (float)4并因此相当于f * 4.0f.编译器可以将这些形式中的任何一个转换为它将转换另一个形式的相同代码,并且任何非玩具编译器都知道它们是等效的(例如,作为常量传播优化传递的应用(float)4).
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |