似乎无处不在,我读到如果不需要RTTI,或者文章建议不要使用它,图书馆就会自夸。它有什么不好的,为什么不需要它这么好呢?
由于
答案 0 :(得分:14)
因为使用它通常意味着你正在颠覆多态(if (type is foo) { do this; } else if (type is bar) { do that; } else ...
),这通常意味着你已经将自己设计成一个角落,需要重新考虑你的设计。
因为C ++编译器的作者在优化多态行为方面付出了很多努力,但在优化RTTI的使用方面则不那么努力。
答案 1 :(得分:2)
C ++允许使用模板进行大量静态技巧,从而减少了对RTTI的需求(在编译时一切都是通用的,但在运行时是具体的。)
相反,处理类的“真实”(SmallTalk-like)OOP方式需要动态绑定和RTTI。
C ++允许这两者,但过多的dynamic_cast和虚函数可能会降低性能。
答案 2 :(得分:1)
许多剥离的嵌入式系统将具有不支持RTTI的更简单/更小的实现。如果您的库不需要它,那么您可以移植到更多系统。
答案 3 :(得分:0)
RTTI为CRT(C运行时)带来了更大的作用。 C ++开发人员珍惜执行速度。最后一件事就是引入运行时,这会使应用程序相对变慢。
答案 4 :(得分:-1)
RTTI在设计时指定的全局唯一序数可以做得更好。不使用RTTI的两个原因。
性能:提出一个可以扩展以及使用序数/枚举来表示类型的实现是非常简单的,因为你不需要命名空间冲突,你必须使用字符串,而不仅仅是字符串,全局唯一字符串。在脚本语言中,一切都是字符串,因此这些语言中没有皱眉。
设计优雅:基于序数的打字工作,如果你使用它,你有可能从一开始就正确地设计系统。这样的设计总是比依赖RTTI好。
答案 5 :(得分:-1)
这不是一件好事(没有/使用RTTI)。绑定应尽可能晚(但不能更晚)。速度和功耗需求限制了您可以约束的时间,但芯片技术的发展意味着越来越多的项目可以承担以后的绑定。后来的绑定允许稍后进行设计决策,当有更多信息可用时,可以做出更好的决策。