在编译时执行常量和重新解释转换吗?

时间:2014-12-05 05:49:28

标签: c++ casting c++03

我已经读过static_cast在编译时发生,dynamic_cast在运行时发生,因此比static_cast慢。 dynamic_cast可以返回null ptr(当使用指针时)或者抛出错误的强制转换异常。我的问题是reinterpret_castconst_cast在编译时或运行时发生了什么?我认为解释转换是在运行时发生的,因为它的行为类似dynamic_cast,表明转换是否成功。我对么 ?那么const_cast是编译时间吗?

3 个答案:

答案 0 :(得分:12)

动态强制转换是唯一需要在运行时“计算”的。所有其他演员表都是在编译时计算的。

  • static_cast的机器代码是一个固定的函数,它基于您正在转换FROM和TO的类型。
  • const_cast的机器代码实际上只是允许将const值作为no-const传递,反之亦然。所以它可以在编译时解决
  • 对于reinterpret_cast,机器代码也可以在编译时解析。一旦它只是“寻找一个指向A型的指针,其眼睛是谁正在寻找B型”。
  • dynamic_cast需要解析虚拟表并根据FROM和TO类型调整虚拟方法的正确地址。这就是为什么它更复杂!

答案 1 :(得分:3)

  • const_cast

    • 用于添加或删除const-ness - 完全是编译时间 - 它不会影响为运行时执行生成的实际代码 - 只有当编译器看到代码尝试时才会停止并显示错误写入const值。

    • 用于添加或删除易失性 - 在编译时发生,但编译器可能会在添加volatile时生成更多和/或更慢的代码,或者在删除volatile时更少/更快的代码;这些代码更改会影响运行时性能(正确性,如果需要波动性)

  • reinterpret_cast改变了编译器对数据的看法,可能导致在运行时执行不同的代码;虽然转换本身不涉及运行时成本,但转换类型在使用的周围环境中可能需要比所需的强制转换类型更多或更少的代码(和处理周期)(如果它甚至支持那些使用的语义)

  • static_cast还会选择在编译时插入的强制转换类型代码 - 与reinterpret_cast一样 - 但数据本身可能会进行额外转换(static_cast<T>(x)相当于T temp(x);)...转换显然可以添加代码和运行时开销

  • dynamic_cast:编译器会考虑其对所涉及的实际类型的了解。

    • 如果执行dynamic_cast的代码上下文仅通过指针或来自某些其他代码的引用知道强制转换对象,并且无法确定变量的实际运行时类型,它必须使用运行时类型信息(RTTI)来查看运行时类型是否/如何与强制转换类型相关。

    • 如果在编译时已知实际的强制转换类型,则编译器可以在两个指针或引用类型之间替换等效的static_cast。利用其对实际类型的了解,它可以确定是否需要调整指针/引用(例如,添加或减去与另一个类中的一个类的偏移相对应的一些字节数)或最终实际上是{{1同一地址。

答案 2 :(得分:2)

这里有一个非常详细的规范可以回答你的问题:

http://en.cppreference.com/w/cpp/language/reinterpret_cast

有效地,reinterpret_cast&lt;&gt;不留任何运行时间。

const_cast也是编译时间,不需要生成代码。