c++ - 尽管有切片,为什么 static_cast 仍然可以使用空指针?

标签 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的地址重合 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/

相关文章:

javascript - 为什么在返回实际元素之前返回 null

java - Chronometer 为空,即使父类初始化了它

c++ - 添加预处理器 #define 以更改包含哪些 header 以及调用哪些函数

c++ - 抛出和共享对象的可见性

c# - 在 C# 中,将接口(interface)列表转换为对象列表的推荐方法是什么?

如果连接表中没有记录,mysql 结果

c++ - 为什么在 C++ 中虚拟函数表指针 (vfptr) 不能是静态的?

c++ - 从 Visual Studio C++ 项目在 cmd 行上运行 .exe

java - 将关联的字符(来自 ASCII)放入对象类型列表中

c# - System.Convert.ToDouble 与(双)