RTTI有什么弊端?Qt中qobject_cast相比dynamic_cast有哪些优势?
关于Qt qobject_cast与C++ dynamic_cast的相关问题解答
qobject_cast相比dynamic_cast的优势
- 无需依赖C++ RTTI特性即可正常运行,哪怕项目在编译阶段关闭了RTTI选项也不会影响转换功能
- 可以跨动态库边界稳定完成类型转换,不会出现dynamic_cast常见的、不同动态库内同一类型识别失败的问题
- 针对QObject的元对象体系做了定向优化,运行时转换的性能比通用的dynamic_cast更高
- 语法和行为和dynamic_cast对齐,转换失败时会返回空指针,原有使用dynamic_cast的代码迁移成本极低
RTTI的常见问题
- 运行时开销问题:RTTI会为每个多态类生成额外的类型信息存储,同时dynamic_cast的类型校验也会引入额外的运行时消耗,对性能要求极高的场景(比如嵌入式、实时计算场景)属于冗余开销
- 兼容性问题:部分旧编译器、嵌入式平台的RTTI支持存在缺陷,不同编译配置、不同编译器生成的二进制文件的RTTI标识不统一,跨动态库调用时很容易出现类型识别错误
- 灵活性问题:很多项目为了压缩二进制体积、提升运行效率会主动关闭RTTI编译选项,此时所有依赖RTTI的功能(包括dynamic_cast、typeid)都会完全失效
QObject继承体系的转换选择
只要目标类型是继承自QObject、且类声明中添加了Q_OBJECT宏的类,都应该优先使用qobject_cast。
注意qobject_cast仅适用于QObject派生类的类型转换,非QObject派生的类还是需要使用dynamic_cast或者其他类型转换方式。
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

