为什么尽管进行了切片,static_cast仍然使用空指针
Why does static_cast still work with null pointers in spite of slicing?
如果我们使用多重继承,切片将使父对象的地址与叶对象的地址不同:
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
相比,也就是说)。但是,如果我们有一个指向 0
的Z*
,则每个强制转换为父级也应该并且确实会产生一个空指针。为什么这样做以及如何实施?这是否意味着每个static_cast
都引入了一个分支指令?
是的,从指向派生类的指针到指向基类的指针的隐式转换以及再次返回的static_cast
都必须保留 null 指针值。这意味着,对于基类地址与派生类地址不一致的多个继承情况,生成的代码中通常需要分支。
从理论上讲,实现可以在"零"地址周围保留一系列地址来表示空指针并在这种情况下避免分支,但代价是增加额外的检查以比较空指针。
相关文章:
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 运行时错误:引用绑定到类型为"int"的空指针
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 为什么我在空指针错误(链表)中获取成员访问权限
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 成员访问是否在空指针上定义C++?
- 尝试将对象插入空指针数组时出现分段错误
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 是否允许向空指针添加零?
- 为什么 C 样式字符串的工作空指针检查不?
- 在函数内初始化无符号字符指针将返回空指针
- 为什么多维数组中的空字符串文本衰减为空指针?
- C++ 取消引用指向矢量的空指针时的分段错误
- 错误 C6011:取消引用空指针"NAME"。C++
- cppcheck取消引用空指针
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- 递增空指针无法正确设置值
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 将多映射转换为空指针,然后转换回多映射