为什么尽管进行了切片,static_cast仍然使用空指针

Why does static_cast still work with null pointers in spite of slicing?

本文关键字:cast 空指针 static 切片 为什么      更新时间:2023-10-16

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

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

因此,如果我们有一个 Z对象 z ,它的地址&z不会与其Y父级的地址一致:static_cast<Y*>(&z)&z大四个字节。

static_cast的好处是它是静态的,所以不占用运行时(与 dynamic_cast 相比,也就是说)。但是,如果我们有一个指向 0Z*,则每个强制转换为父级也应该并且确实会产生一个空指针。为什么这样做以及如何实施?这是否意味着每个static_cast都引入了一个分支指令?

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

从理论上讲,实现可以在"零"地址周围保留一系列地址来表示空指针并在这种情况下避免分支,但代价是增加额外的检查以比较空指针。