4

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

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)。但是,如果我们有一个Z*指向 的0,那么每个对父级的强制转换也应该并且确实会产生一个空指针。为什么这个工作以及它是如何实施的?这是否意味着每一个都static_cast引入了一个分支指令?

4

1 回答 1

7

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

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

于 2012-06-09T14:38:33.643 回答