为了从两个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值。

在这两种情况下,在强制转换之后,都会在运行时进行整数/浮点(或浮点/整数)除法。

这种直觉是正确的吗,还是编译器足够聪明,可以在两种情况下同样好地进行优化?还有其他我忽略的因素吗?

最佳答案

在运行时不会发生int/floatfloat/int划分。曾经

由于一个操作数正被强制转换为float(显式转换),因此另一个将被隐式转换为float进行除法。

两种情况都相当于

static_cast<float>(a) / static_cast<float>(b);

关于c++ - static_casted哪个整数操作数以获得浮点结果有关系吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30116970/

10-13 08:13