我使用gcc的-fno-rtti标志来编译我的C ++,没有运行时types信息。 假设我没有使用dynamic_cast<>或typeid() ,有什么可能导致我以后的问题?
我希望创build一个替代std::type_index不需要RTTI : template <typename T> int* type_id() { static int x; return &x; } 请注意,局部variablesx的地址被用作typesID,而不是x本身的值。 另外,我不打算在现实中使用裸指针。 我刚刚清除了与我的问题无关的所有内容。 看到我的实际type_index实施在这里 。 这种方法是否合理?如果是这样,为什么? 如果没有,为什么不呢? 我觉得我在这里摇摇欲坠,所以我对我的方法为什么会起作用或不起作用的确切原因感兴趣。 一个典型的用例可能是在运行时注册例程以通过单个接口处理不同types的对象: class processor { public: template <typename T, typename Handler> void register_handler(Handler handler) { handlers[type_id<T>()] = [handler](void const* v) { handler(*static_cast<T const*>(v)); }; } template <typename T> void process(T const& t) { auto […]
我听说过很多关于Delphi 2010新的/改进的RTTIfunction ,但我必须承认我的无知……我不明白这一点。 我知道Delphi的每个版本都支持RTTI …我知道RTTI(运行时types信息)允许我在运行应用程序时访问types信息。 但究竟是什么意思呢? Delphi 2010的RTTI支持与.NET中的reflection相同吗? 有人可以解释为什么RTTI是有用的吗? 假装我是你尖尖的头发老板,并帮助我理解为什么RTTI很酷。 我如何在真实世界的应用程序中使用它?
我有一个非常简单的关于dynamic_cast运算符的问题。 我知道这是用于运行时types识别,即在运行时了解对象types。 但是从你的编程经验来说,你能给出一个真实的场景,你必须使用这个操作符吗? 没有使用它有什么困难?
查看LLVM文档,他们提到他们使用“RTTI的自定义forms” ,这就是他们具有isa<> , cast<>和dyn_cast<>模板函数的原因。 通常,阅读一个库重新实现一些语言的一些基本function是一个可怕的代码气味,只是邀请运行。 但是,我们正在谈论的是LLVM:这些人正在研究C ++编译器和 C ++运行时。 如果他们不知道自己在做什么,那么我就非常烦了,因为我更喜欢使用Mac OS附带的gcc版本。 尽pipe如此,还是比他们less尝试,我仍然想知道正常RTTI的缺陷是什么。 我知道它只适用于具有V表的types,但是这只会引出两个问题: 既然你只是需要一个虚拟的方法来有一个虚拟表,为什么他们不只是一个方法标记为virtual ? 虚拟析构函数似乎擅长这一点。 如果他们的解决scheme不使用普通的RTTI,那么有什么想法是如何实现的?
几乎所有我见过的关于这种事情的C ++资源都告诉我,我应该更喜欢使用RTTI(运行时types标识)的多态方法。 总的来说,我认真对待这种build议,并试图理解其中的基本原理 – 毕竟,C ++是一个强大的野兽,它的全面深入难以理解。 然而,对于这个特定的问题,我画了一个空白,想看看互联网可以提供什么样的build议。 首先,让我总结一下我所学到的东西,列举出为什么RTTI被认为是“有害”的常见原因: 一些编译器不使用它/ RTTI并不总是启用 我真的不买这个说法。 这就像说我不应该使用C ++ 14的function,因为有编译器不支持它。 然而,没有人会阻止我使用C ++ 14的function。 大多数项目将影响他们正在使用的编译器,以及如何configuration。 甚至引用海合会的手册页: -fno-rtti 禁止生成有关虚拟函数的每个类的信息,供C ++运行时types标识特性(dynamic_cast和typeid)使用。 如果你不使用这些语言的部分,你可以使用这个标志来节省一些空间。 请注意,exception处理使用相同的信息,但G ++根据需要生成它。 dynamic_cast操作符仍然可以用于不需要运行时types信息的转换,即转换为“void *”或明确的基类。 这告诉我, 如果我不使用RTTI,我可以禁用它。 这就像说,如果你不使用Boost,你不必链接到它。 我不需要计划有人用-fno-rtti编译的情况。 另外,在这种情况下,编译器将会失败。 它需要额外的内存/可以很慢 每当我试图使用RTTI,这意味着我需要访问我的类的某种types的信息或特点。 如果我实现一个不使用RTTI的解决scheme,这通常意味着我将不得不添加一些字段到我的类来存储这些信息,所以内存参数是无效的(我将举一个更进一步的例子)。 dynamic_cast的确可以很慢。 不过,通常有避免使用速度危机的方法。 我不太明白这个select。 这个答案build议使用在基类中定义的枚举来存储types。 只有当你知道你所有的派生类时,这才有效。 这是一个相当大的“如果”! 从这个答案看来,RTTI的成本似乎也不明确。 不同的人测量不同的东西。 优雅的多态devise将使RTTI不必要 这是我认真对待的那种build议。 在这种情况下,我根本无法提出涵盖我的RTTI用例的好的非RTTI解决scheme。 让我举个例子: 假设我正在编写一个库来处理某些对象的graphics。 我想让用户在使用我的库时生成自己的types(所以枚举方法不可用)。 我有我的节点的基类: class node_base { public: node_base(); […]
哪些代码段速度更快? if (obj is ClassA) {} if (obj.GetType() == typeof(ClassA)) {} 编辑:我知道他们不做同样的事情。
据此, void*没有RTTI信息,因此从void*投出是不合法的,这是有道理的。 如果我没有记错, void* dynamic_cast正在gcc上工作。 你能否澄清这个问题?
我知道有使用RTTI的资源,但它有多大? 我所看到的任何地方都只是说“RTTI很昂贵”,但是他们都没有提供任何基准或定量数据来调节内存,处理器时间或速度。 那么,RTTI有多贵? 我可能在一个只有4MB内存的embedded式系统上使用它,所以每一个位都是重要的。 编辑: 根据S.罗特的答案 ,如果我包括我实际上在做什么会更好。 我正在使用一个类来传递不同长度的数据,并且可以执行不同的操作 ,所以使用虚拟函数很难做到这一点。 似乎使用一些dynamic_cast可以解决这个问题,允许不同的派生类通过不同的级别,但仍然允许他们完全不同的行为。 从我的理解, dynamic_cast使用RTTI,所以我想知道在一个有限的系统上使用是多么可行。