为什么RTTI似乎不受欢迎
Why does RTTI seem frowned upon?
似乎我读到的任何地方都认为,如果不需要RTTI,图书馆就会吹嘘,或者一篇文章建议不要使用它。它有什么不好,为什么不需要它是一件好事?
谢谢
-
因为使用它通常意味着你正在颠覆多态性(
if (type is foo) { do this; } else if (type is bar) { do that; } else ...
),这通常意味着你已经把自己设计成一个角落,需要重新思考你的设计。 -
因为C++编译器的作者在优化多态行为方面投入了大量精力,但在优化RTTI的使用方面却很少。
C++允许使用模板进行许多静态技巧,从而减少了对RTTI的需求(所有内容在编译时都是通用的,但在运行时是具体的)。
另一方面,处理类的"真实"(类似SmallTalk)OOP方式需要动态绑定和RTTI。
C++允许两者兼而有之,但过多的dynamic_casts和虚函数可能会降低性能。
许多精简的嵌入式系统将具有不支持RTTI的更简单/更小的实现。 如果您的库不需要它,那么您可以移植到更多系统。
RTTI为CRT(C Runtime)引入了更大的角色。C++开发人员都珍视执行速度。人们最不想要的是引入运行时,这会相对减慢应用程序的速度。
RTTI 做了在设计时指定的全局唯一序数可以做得更好的事情。不使用RTTI的两个原因。
性能 :提出一个可扩展的实现以及使用序数/枚举来表示类型并非易事,并且由于您不希望命名空间冲突,因此您必须使用字符串,而不仅仅是字符串,全局唯一的字符串。在脚本语言中,一切都是字符串,因此在这些语言中没有皱眉。
设计优雅:基于序数的打字有效,如果您使用它,那么您很可能从一开始就有远见地正确设计系统。这样的设计几乎总是比依赖RTTI更好。
一件好事(没有/使用RTTI)。绑定应尽可能晚(但不能晚)。速度和功耗需求限制了您的绑定时间,但芯片技术的发展意味着越来越多的项目可以承担后期绑定的费用。稍后绑定允许在以后做出设计决策,当更多信息可用时,可以做出更好的决策。
- IpOpt拒绝解决不受约束的问题
- 循环仅对第一行正常工作.其他行不受 for 的影响
- 如何保护非托管应用程序中的字符串不受进程转储的影响
- 检查nullptr是否100%保护内存布局不受segfault影响
- 未使用的 asm() 在不受支持的体系结构上的行为
- 如何在不受其他文件影响的情况下"by itself" Visual Studio 项目中运行C++文件?
- 为什么模板构造函数比复制构造函数更受欢迎?
- 可视化如何确定项目是由C 项目管理还是不受管理的C 项目
- 如何在QTextDocument中使用表格的框架属性,即使它不受支持?
- 为什么重载解析更喜欢不受约束的模板函数而不是更具体的模板函数?
- 将字节数组从c 不受管理的dll传递到c#unity
- 不受控制的循环和函数 C++跳过
- 程序流不受正向声明影响
- 如何将struct从c#管理到c 不受管理的dll并获得结构
- 函数不受主内存约束的函数所需的复杂性是什么?
- 获取X509代码签名证书的序列号,以不受管理的C/C 签名
- 将C#struct传递给C 不受管理的DLL返回错误结果
- NVCC 致命:安装 CUDA9.0 时'compute_20'不受支持的 GPU 架构
- 如何在 Windows 异常处理程序中设置 MMX 寄存器以模拟不受支持的 3DNow! 说明
- 为什么RTTI似乎不受欢迎