bit*_*ask 4 c++ null casting static-cast object-slicing
如果我们使用多重继承,切片将使父对象的地址与地址到叶对象不同:
struct X {int x};
struct Y {int y};
struct Z : X, Y {int z};
Run Code Online (Sandbox Code Playgroud)
因此,如果我们有一个Z对象z,它的地址&z将不与Y其父对象的地址重合:static_cast<Y*>(&z)高出四个字节&z.
好处static_cast是,它是静态的,因此不会占用运行时间(相比之下dynamic_cast).但是,如果我们有一个Z*指向的内容0,那么每次转换为父级都应该并且确实产生一个空指针.为什么这样做以及如何实施?这是否意味着每一个都static_cast引入了分支指令?
是的,从指向派生类的指针到指向基类的指针的隐式转换和static_cast返回的指针都必须保留空指针值.这意味着在生成的代码中通常需要一个分支用于多个继承情况,其中基类地址与派生类地址不一致.
从理论上讲,实现可以在"零"地址周围保留一系列地址来表示空指针,并避免在这种情况下使用分支,但这会以增加额外检查来进行空指针比较为代价.