是static_cast <T>(...)编译时还是运行时?

Vit*_*meo 12 c++ casting runtime compile-time c++11

static_cast<T>(...)在编译时还是在运行时完成的事情?我用Google搜索了但我得到了不同的答案.

此外,dynamic_cast<T>(...)显然是运行时 - 但是呢reinterpret_cast<T>(...)

Igo*_*nik 9

取决于你正在投射什么.例如,static_cast<std::string>("Hello")最终调用std::string构造函数.

在我的脑海中,我想不出任何reinterpret_cast需要生成实际机器指令的情况.它只是告诉编译器:采用这种位模式,并认为它是这种类型的值.

  • 除非绝对必要,否则你不应该使用`reinterpret_cast`,而且你完全理解你在做什么.`reinterpret_cast <float>(42)`不**产生42f:它产生一些浮点值恰好与整数42具有相同的位表示.尝试它,它应该证明是有教育意义的. (6认同)
  • @VittorioRomeo即使`int`和`float`的大小相同,它们也不会共享相同的二进制表示.因此,在两者之间转换的`reinterpret_cast`几乎肯定不是你想要的.事实上,你应该完全放下`reinterpret_cast`,直到你确切知道你在做什么. (4认同)

Mar*_*ssi 5

编译时间。事实上,编译器甚至不会插入运行时代码来检查结果是否正确。当然,编译器确实会检查转换是否可以静态进行。示例:从子类转换到超类。如果转换需要调用内置函数或强制转换函数,它们当然会在运行时执行,但不会进行类型检查。

  • 即使从子类转换到超类也可能导致必须生成运行时代码,例如,当所述超类实际上是虚拟基类时。 (4认同)