为什么RTTI似乎不受欢迎

Why does RTTI seem frowned upon?

本文关键字:不受欢迎 RTTI 为什么      更新时间:2023-10-16

似乎我读到的任何地方都认为,如果不需要RTTI,图书馆就会吹嘘,或者一篇文章建议不要使用它。它有什么不好,为什么不需要它是一件好事?

谢谢

  1. 因为使用它通常意味着你正在颠覆多态性(if (type is foo) { do this; } else if (type is bar) { do that; } else ...),这通常意味着你已经把自己设计成一个角落,需要重新思考你的设计。

  2. 因为C++编译器的作者在优化多态行为方面投入了大量精力,但在优化RTTI的使用方面却很少。

C++允许使用模板进行许多静态技巧,从而减少了对RTTI的需求(所有内容在编译时都是通用的,但在运行时是具体的)。

另一方面,处理类的"真实"(类似SmallTalk)OOP方式需要动态绑定和RTTI。

C++允许两者兼而有之,但过多的dynamic_casts和虚函数可能会降低性能。

许多精简的嵌入式系统将具有不支持RTTI的更简单/更小的实现。 如果您的库不需要它,那么您可以移植到更多系统。

RTTI为CRT(C Runtime)引入了更大的角色。C++开发人员都珍视执行速度。人们最不想要的是引入运行时,这会相对减慢应用程序的速度。

RTTI 做了在设计时指定的全局唯一序数可以做得更好的事情。不使用RTTI的两个原因。

性能 :提出一个可扩展的实现以及使用序数/枚举来表示类型并非易事,并且由于您不希望命名空间冲突,因此您必须使用字符串,而不仅仅是字符串,全局唯一的字符串。在脚本语言中,一切都是字符串,因此在这些语言中没有皱眉。

设计

优雅:基于序数的打字有效,如果您使用它,那么您很可能从一开始就有远见地正确设计系统。这样的设计几乎总是比依赖RTTI更好。

这不是

一件好事(没有/使用RTTI)。绑定应尽可能晚(但不能晚)。速度和功耗需求限制了您的绑定时间,但芯片技术的发展意味着越来越多的项目可以承担后期绑定的费用。稍后绑定允许在以后做出设计决策,当更多信息可用时,可以做出更好的决策。