要从两个int
的除法中获得浮点结果,我们static_cast
float
的一个操作数,如下所示:
int a = 2;
int b = 3;
float c = static_cast<float>(a) / b; // c = 0.666666
float d = a / static_cast<float>(b); // d = 0.666666
在上面的例子中,哪个操作数是static_cast
ed并不重要。但是,假设其中一个操作数是编译时常量,而另一个则不是,如下所示:
int a = foo(); // value not available at compile-time.
const int b = SOME_CONSTANT; // compile-time constant.
编译器优化是否会对两个static_cast
产生任何影响,如下所述?
float c = static_cast<float>(a) / b;
在这种情况下,编译器可以用它的值替换b
,但由于a
未知,所以强制转换只能在运行时发生。
float d = a / static_cast<float>(b);
但是,在这种情况下,编译器知道b
,因此它可以在编译时进行转换,并直接用b
值替换float
。
在这两种情况下,在转换之后,整数/浮点(或浮点/整数)除法在运行时发生。
这种直觉是否正确,或者编译器是否足够聪明,可以在两种情况下同样优化?还有其他因素我忽略了吗?
答案 0 :(得分:5)
运行时没有int/float
或float/int
分区。如初。
由于一个操作数正在被转换 - 显式转换为float
,另一个操作数将被隐式转换为float
以进行除法。
你的案件都等同于
static_cast<float>(a) / static_cast<float>(b);