整数除法的哪个操作数是static_casted以获得浮点结果是否重要?

Mas*_*Man 2 c++ casting compiler-optimization

要从两个ints的除法中获得浮点结果,我们就是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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,static_cast编辑哪个操作数无关紧要.但是,假设其中一个操作数是编译时常量,而另一个不是,如下所示:

int a = foo();  // value not available at compile-time.
const int b = SOME_CONSTANT;  // compile-time constant.
Run Code Online (Sandbox Code Playgroud)

编译器优化是否会对两者产生任何影响static_cast,如下所述?

float c = static_cast<float>(a) / b;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器可以b用其值替换,但由于a未知,因此强制转换只能在运行时进行.

float d = a / static_cast<float>(b);
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,编译器知道b,因此它可以在编译时进行转换,并b直接替换该float值.

在这两种情况下,在转换之后,整数/浮点(或浮点/整数)除法在运行时发生.

这种直觉是否正确,或者编译器是否足够智能以在两种情况下都能同样优化?还有其他因素我忽略了吗?

mol*_*ilo 5

在运行时没有int/floatfloat/int分裂.永远.

由于一个操作数正在被转换 - 显式转换为 - float,另一个将被隐式转换float为除法.

你的两个案件都相当于

static_cast<float>(a) / static_cast<float>(b);
Run Code Online (Sandbox Code Playgroud)