Questions tagged «rtti»

11
RTTI的价格是多少?
我了解使用RTTI会带来资源损失,但是它有多大?我看过的每个地方都只是说“ RTTI很昂贵”,但是它们都没有给出任何基准或定量的数据保护内存,处理器时间或速度。 那么,RTTI到底有多贵?我可能会在只有4MB RAM的嵌入式系统上使用它,因此每一位都很重要。 编辑:根据S. Lott的回答,如果我包括我实际在做的事情会更好。 我正在使用一个类来传递不同长度的数据,并且可以执行不同的操作,因此仅使用虚函数很难做到这一点。似乎使用了一些dynamic_cast s可以通过允许不同的派生类通过不同的级别传递而仍然允许它们采取完全不同的操作来解决此问题。 据我了解,dynamic_cast它使用RTTI,所以我想知道在有限的系统上使用RTTI的可行性。
152 c++  performance  rtti 

4
是vs typeof
以下哪段代码更快? if (obj is ClassA) {} if (obj.GetType() == typeof(ClassA)) {} 编辑:我知道他们不会做同样的事情。
150 c#  rtti 

7
为什么“纯多态”优于使用RTTI?
我所见过的几乎所有讨论这种事情的C ++资源都告诉我,与使用RTTI(运行时类型标识)相比,我应该更喜欢多态方法。总的来说,我会认真对待这种建议,并会尝试并理解其基本原理-毕竟,C ++是一头强大的野兽,很难全面理解。但是,对于这个特定的问题,我正在空白,想看看互联网可以提供什么样的建议。首先,让我总结一下到目前为止我所学到的东西,列出引起RTTI被“认为有害”的常见原因: 一些编译器不使用它/ RTTI并非始终启用 我真的不赞成这种说法。这就像说我不应该使用C ++ 14功能,因为那里有不支持它的编译器。但是,没有人会阻止我使用C ++ 14功能。大多数项目将对他们正在使用的编译器及其配置方式产生影响。甚至引用了gcc手册页: -fno-rtti 使用C ++运行时类型标识功能(dynamic_cast和typeid)禁止使用虚拟函数生成有关每个类的信息。如果您不使用语言的这些部分,则可以使用此标志节省一些空间。请注意,异常处理使用相同的信息,但是G ++会根据需要生成它。dynamic_cast运算符仍可用于不需要运行时类型信息的强制转换,即强制转换为“ void *”或明确的基类。 这说明如果我不使用RTTI,可以将其禁用。这就像在说,如果您不使用Boost,则不必链接到它。我不需要为有人正在编译的情况做任何计划-fno-rtti。另外,在这种情况下,编译器将大声失败。 花费额外的内存/可能很慢 每当我想使用RTTI时,这意味着我需要访问类的某种类型信息或特征。如果我实现了不使用RTTI的解决方案,这通常意味着我将不得不在类中添加一些字段来存储此信息,因此memory参数实在是无效的(我会在下面进一步举例说明)。 实际上,dynamic_cast可能很慢。不过,通常有避免使用速度要求严格的情况的方法。而且我还没有看到替代方案。这样的SO答案建议使用基类中定义的枚举来存储类型。这只有在您知道所有派生类都是先验的情况下才有效。相当大的“如果”! 从这个答案来看,RTTI的成本似乎也不清楚。不同的人测量不同的东西。 优雅的多态设计将使RTTI不再必要 这是我认真对待的建议。在这种情况下,我简直无法提出涵盖我的RTTI用例的良好的非RTTI解决方案。让我举一个例子: 假设我正在编写一个库来处理某种对象的图形。我想允许用户在使用我的库时生成自己的类型(因此enum方法不可用)。我的节点有一个基类: class node_base { public: node_base(); virtual ~node_base(); std::vector< std::shared_ptr<node_base> > get_adjacent_nodes(); }; 现在,我的节点可以是不同的类型。这些怎么样: class red_node : virtual public node_base { public: red_node(); virtual ~red_node(); void get_redness(); …
106 c++  polymorphism  rtti 

4
什么会使C ++ RTTI不受欢迎?
在查看LLVM文档时,他们提到他们使用“ RTTI的自定义形式”,这就是他们拥有isa<>,cast<>和dyn_cast<>模板功能。 通常,读到库重新实现某种语言的某些基本功能后,这会产生可怕的代码味道,并且会被邀请运行。但是,这就是我们所说的LLVM:这些家伙正在研究C ++编译器和C ++运行时。如果他们不知道自己在做什么,那我就很困惑,因为我更喜欢Mac OS附带clang的gcc版本。 尽管如此,由于经验不足,我仍然想知道普通RTTI的陷阱是什么。我知道它仅适用于具有v表的类型,但这仅引发两个问题: 由于您只需要一个虚拟方法来拥有一个vtable,为什么他们不只是将一个方法标记为virtual?虚拟析构函数似乎擅长于此。 如果他们的解决方案不使用常规的RTTI,是否知道如何实现?
67 c++  llvm  rtti 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.