【问题标题】:Do constant and reinterpret cast happen at compile time?常量和重新解释转换是否在编译时发生?
【发布时间】:2014-12-05 05:49:27
【问题描述】:

我读到static_cast 发生在编译时,dynamic_cast 发生在运行时,因此比static_cast 慢。 dynamic_cast 可以返回 null ptr(与指针一起使用时)或以其他方式抛出错误的强制转换异常。我的问题是reinterpret_castconst_cast 是发生在编译时还是运行时?我认为解释转换发生在运行时,因为它的行为类似于dynamic_cast,表明转换是否成功。我对么 ? const_cast 那编译时间呢?

【问题讨论】:

  • 在编译时不会发生任何类型转换。一般来说,您只有运行时的数据。
  • @manasij7479 这完全不正确。

标签: c++ casting c++03


【解决方案1】:

动态转换是唯一需要在运行时“计算”的。所有其他类型转换都是在编译时计算的。

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

【讨论】:

    【解决方案2】:
    • const_cast

      • 用于添加或删除 const-ness - 完全是编译时的 - 它不会影响为运行时执行生成的实际代码 - 仅当编译器看到代码试图停止时是否因错误而停止写入const 值。

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

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

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

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

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

      • 如果实际的 cast-from 类型在编译时已知,编译器可以在两个指针或引用类型之间替换 static_cast 的等效项。使用它对实际类型的了解,它可以确定是否需要调整指针/引用(例如,添加或减去与另一个类中的一个类的偏移量相对应的一些字节数)或最终成为有效的reinterpret_cast同一个地址。

    【讨论】:

      【解决方案3】:

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

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

      实际上,reinterpret_cast 不会留下运行时足迹。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-27
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多