为什么static_cast仍然可以使用空指针尽管切片?

时间:2012-06-09 14:27:07

标签: c++ casting null static-cast object-slicing

如果我们使用多重继承,切片会使父对象的地址与地址对象不同:

struct X {int x};
struct Y {int y};
struct Z : X, Y {int z};

因此,如果我们有Z个对象z,则其地址&z与其Y父级的地址重合:{ {1}}比static_cast<Y*>(&z)高四个字节。

关于&z的好处是,它是静态的,因此不占用运行时间(与static_cast相比,即)。 但是,如果我们的dynamic_cast指向Z*,那么每次转换为父级都应并且也会产生空指针。 为什么这样做以及如何实施?这是否意味着每个0都引入了分支指令?

1 个答案:

答案 0 :(得分:7)

是的,从指向派生类的指针到指向基类的指针和static_cast的隐式转换都必须保留空指针值。这意味着在生成的代码中,对于多个继承情况,通常需要一个分支,其中基类地址与派生类地址不一致。

理论上,实现可以在“零”地址周围保留一系列地址来表示空指针,并避免在这种情况下使用分支,但这会以增加额外检查来进行空指针比较为代价。 / p>