【问题标题】:Is static_cast<T>(...) compile-time or run-time?static_cast<T>(...) 是编译时还是运行时?
【发布时间】:2013-08-29 13:33:40
【问题描述】:

static_cast&lt;T&gt;(...) 是在编译时还是运行时完成的?我用谷歌搜索,但我得到了不同的答案。

另外,dynamic_cast&lt;T&gt;(...) 显然是运行时 - 但 reinterpret_cast&lt;T&gt;(...) 呢?

【问题讨论】:

  • “静态”...线索就在名字里。
  • static_cast 不执行运行时检查。
  • 从现有答案来看,这里需要决定的更大问题是您所说的“在编译时完成”。虽然在编译时选择要使用的转换,但实际转换本身可以(并且通常会)很好地导致需要在运行时执行的转换代码。

标签: c++ c++11 casting runtime compile-time


【解决方案1】:

取决于您要转换的内容。例如。 static_cast&lt;std::string&gt;("Hello") 最终调用 std::string 构造函数。

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

【讨论】:

  • 哦,有趣。这有什么规则?当我将int 转换为float 时会发生这种情况吗?当我将float 转换为int 时?
  • 两者都可能需要生成一些机器指令,除非您正在转换编译时常量(也就是说,如果您编写 static_cast&lt;float&gt;(42),编译器通常会足够聪明,只需将其替换为42f 在编译时)。
  • 会用-O3优化吗?或者当我确定我正在为性能密集型数字转换做什么时,我应该使用reinterpret_cast
  • 除非绝对必要,否则您应该使用reinterpret_cast,并且您完全理解自己在做什么。 reinterpret_cast&lt;float&gt;(42) 不会产生 42f:它会产生一些浮点值,恰好与整数 42 具有相同的位表示。试试吧,它应该证明是有教育意义的。
  • @VittorioRomeo 即使intfloat 的大小相同,它们也不共享相同的二进制表示。因此,在两者之间转换的reinterpret_cast 几乎肯定不是您想要的。事实上,您可能应该完全解雇reinterpret_cast,直到您确切知道自己在做什么。
【解决方案2】:

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

【讨论】:

  • 即使从子类转换到超类也可能导致必须生成运行时代码,例如当所说的超类实际上是一个虚拟基类时。
  • @IgorTandetnik 对。我的意思是类型检查代码。试图纠正歧义(或明显的错误!:-))。
猜你喜欢
  • 2013-09-17
  • 2012-06-26
  • 1970-01-01
  • 2012-09-24
  • 2011-04-07
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 2012-12-14
相关资源
最近更新 更多