如果我们使用多重继承,切片将使父对象的地址与叶对象的地址不同:
struct X {int x};
struct Y {int y};
struct Z : X, Y {int z};
所以如果我们有一个 Z
对象 z
, 地址&z
将不与其Y
的地址重合 parent :static_cast<Y*>(&z)
比 &z
高四个字节.
关于 static_cast
的好处是它是静态的,所以不占用运行时间(与 dynamic_cast
相比)。
但是,如果我们有一个 Z*
指向 0
,对父对象的每次转换都应该并且确实产生一个空指针。
为什么这样做有效以及如何实现?这是否意味着每一个 static_cast
引入分支指令?
最佳答案
是的,从指向派生类的指针到指向基类的指针的隐式转换以及再次返回的 static_cast
都必须保留空指针值。这意味着对于基类地址与派生类地址不一致的多重继承情况,生成的代码中通常需要分支。
在这种情况下,实现在“零”地址周围保留一系列地址以表示空指针并避免分支在理论上是可能的,但这样做的代价是增加空指针比较的额外检查。
关于c++ - 尽管有切片,为什么 static_cast 仍然可以使用空指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10961798/