【问题标题】:How is static_cast implemented in c++?c++中的static_cast是如何实现的?
【发布时间】:2014-12-09 11:53:44
【问题描述】:

static_cast 是如何工作的?如果你正在做类似的事情......

如果 D 通过一些未指定的层次结构(不一定直接)从 B 继承,并且您这样做:

B* b = new D();
D* d = static_cast<D*>(b);

发生了什么?它只是在编译时计算偏移量并将该偏移量应用于指针吗?还是在运行时发生了什么事情才能进行演员表?

【问题讨论】:

  • static_cast 总是使用编译时类型信息解析。 (这可能涉及运行时操作)。如果它不是一个合适的演员,你要么得到一个编译错误或未定义的行为。在您的 sn-p 中可以,因为 bD;但是,如果 bnew B(),则转换编译但如果运行会导致未定义的行为。
  • 是的,它只是在编译时计算偏移量并添加它。除非有多重继承和/或虚拟继承(或者你有一个非常奇怪的编译器),否则偏移量无论如何都会为 0,所以实际上不会发出额外的代码。
  • 参见 Effective C++ Item 27 Minimize Casting。

标签: c++ casting static-cast


【解决方案1】:

发生了什么?

编译器假定您知道自己在做什么,因此指针确实指向D 对象,并相应地更改指针类型,必要时调整值以指​​向完整的D 对象而不是B 子对象。

如果你弄错了,并使用了一个D* 指针,它并不真正指向D 对象,那么你会得到未定义的行为;所以要小心。

它只是在编译时计算偏移量并将该偏移量应用于指针吗?

是的。

或者在运行时发生了什么事情来进行演员表?

没有; “静态”意味着它仅使用编译时信息。唯一的运行时活动是在必要时添加固定偏移量。

如果您想要运行时检查转换是否有效(只要类型是多态的),请使用dynamic_cast。如果那里没有真正的 D 对象,它将给出一个空指针(或者如果你正在转换引用而不是指针,则抛出 bad_cast 异常)。

【讨论】:

  • 要在这里得到完整的答案,您能否通过简单地写D* d = ((D*)b);来解释这两者的区别来完成您的答案。
  • @Emadpres:在这种情况下,C 风格的演员表与static_cast 的作用完全相同;不同之处在于,在static_cast 失败的情况下,它可能会退回到更可疑的转换。但这个问题专门针对static_cast,所以这并不是特别相关。
猜你喜欢
  • 2015-09-03
  • 1970-01-01
  • 2011-03-05
  • 2018-08-24
  • 2011-04-07
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
相关资源
最近更新 更多