在C++程序中启用RTTI会产生哪些内存/性能开销?任何人都可以在RTTI机制的内部实现和相关开销之间进行一些说明吗?我确实了解如何通过typeid和dynamic_cast使用RTTI,我想知道的是运行时如何跟踪此信息以及它如何跟踪的内部实现细节是开销吗? 最佳答案 启用RTTI通常只会带来很小的开销。通常的实现带有一个指向对象vtable中类型信息结构的指针。由于无论如何都必须构造vtable,因此额外的时间很少-这就像在类中添加另一个虚函数一样。typeid因此相当于调用虚函数。dynamic_cast较慢-它需要遍历继承层次
在C++程序中启用RTTI会产生哪些内存/性能开销?任何人都可以在RTTI机制的内部实现和相关开销之间进行一些说明吗?我确实了解如何通过typeid和dynamic_cast使用RTTI,我想知道的是运行时如何跟踪此信息以及它如何跟踪的内部实现细节是开销吗? 最佳答案 启用RTTI通常只会带来很小的开销。通常的实现带有一个指向对象vtable中类型信息结构的指针。由于无论如何都必须构造vtable,因此额外的时间很少-这就像在类中添加另一个虚函数一样。typeid因此相当于调用虚函数。dynamic_cast较慢-它需要遍历继承层次
有没有办法获得编译时间typeid来自禁用RTTI的GCC的信息?在VisualStudio下,像constchar*typeName=typeid(int).name();这样的简单命令将适本地返回“int”,即使RTTI被禁用。不幸的是,GCC不能这样做。当我尝试调用typeid没有RTTI,我的程序会崩溃。我知道禁用RTTI不是标准的一部分,但无论如何我可以强制GCC对已知类型进行编译时解析吗?出于性能原因,RTTI被禁用。我不需要运行时RTTI。编辑:这就是我最终的结果:templateconstchar*TypeName(void);templateconstchar*Typ
有没有办法获得编译时间typeid来自禁用RTTI的GCC的信息?在VisualStudio下,像constchar*typeName=typeid(int).name();这样的简单命令将适本地返回“int”,即使RTTI被禁用。不幸的是,GCC不能这样做。当我尝试调用typeid没有RTTI,我的程序会崩溃。我知道禁用RTTI不是标准的一部分,但无论如何我可以强制GCC对已知类型进行编译时解析吗?出于性能原因,RTTI被禁用。我不需要运行时RTTI。编辑:这就是我最终的结果:templateconstchar*TypeName(void);templateconstchar*Typ
如果有的话,有什么C++构造用于在运行时列出类的祖先?基本上,我有一个类,它存储指向任何对象的指针,可能包括原始类型(有点像boost::any,我不想使用它,因为我需要保留对象的所有权)。在内部,这个指针是void*,但是这个类的目标是包装void*具有运行时类型安全性。赋值运算符是模板化的,所以在赋值时我取typeid()传入指针并存储它。然后当我稍后回退时,我可以检查typeid()针对存储的type_info的强制转换类型.如果不匹配,强制转换将抛出异常。但是有一个问题:我似乎失去了多态性。假设B是D的基数.如果我存储指向D的指针在我的类里面,然后存储type_info也将是D
如果有的话,有什么C++构造用于在运行时列出类的祖先?基本上,我有一个类,它存储指向任何对象的指针,可能包括原始类型(有点像boost::any,我不想使用它,因为我需要保留对象的所有权)。在内部,这个指针是void*,但是这个类的目标是包装void*具有运行时类型安全性。赋值运算符是模板化的,所以在赋值时我取typeid()传入指针并存储它。然后当我稍后回退时,我可以检查typeid()针对存储的type_info的强制转换类型.如果不匹配,强制转换将抛出异常。但是有一个问题:我似乎失去了多态性。假设B是D的基数.如果我存储指向D的指针在我的类里面,然后存储type_info也将是D
我很想知道在禁用RTTI的情况下使用动态转换编译代码时会发生什么(在GCC上使用-fno-rtti或在VisualStudio上使用/GR-)。编译器是否“回退”到static_cast?由于(至少在VS上)它只会发出警告,所以编译后的代码会做什么?更具体地说,如果我在没有RTTI的情况下编译我确信dynamic_cast不会出错的代码(即dynamic_cast可以安全地替换为static_cast)喜欢这个:classA{/*...*/};classB:publicA{intfoo(){return42;}};//...A*myA=newB();intbar=(dynamic_ca
我很想知道在禁用RTTI的情况下使用动态转换编译代码时会发生什么(在GCC上使用-fno-rtti或在VisualStudio上使用/GR-)。编译器是否“回退”到static_cast?由于(至少在VS上)它只会发出警告,所以编译后的代码会做什么?更具体地说,如果我在没有RTTI的情况下编译我确信dynamic_cast不会出错的代码(即dynamic_cast可以安全地替换为static_cast)喜欢这个:classA{/*...*/};classB:publicA{intfoo(){return42;}};//...A*myA=newB();intbar=(dynamic_ca
如果我想使用std::any,我可以在关闭RTTI的情况下使用它。以下示例使用gcc的-fno-rtti也可以按预期编译和运行。intmain(){std::anyx;x=9.9;std::cout(x)但是std::any是如何存储类型信息的呢?如我所见,如果我使用“错误”类型调用std::any_cast我会得到std::bad_any_cast异常。这是如何实现的,或者这可能只是一个gcc功能?我发现boost::any也不需要RTTI,但我也发现不是如何解决的。Doesboost::anyneedRTTI?.深入研究STLheader本身并没有给我答案。该代码对我来说几乎无法阅
如果我想使用std::any,我可以在关闭RTTI的情况下使用它。以下示例使用gcc的-fno-rtti也可以按预期编译和运行。intmain(){std::anyx;x=9.9;std::cout(x)但是std::any是如何存储类型信息的呢?如我所见,如果我使用“错误”类型调用std::any_cast我会得到std::bad_any_cast异常。这是如何实现的,或者这可能只是一个gcc功能?我发现boost::any也不需要RTTI,但我也发现不是如何解决的。Doesboost::anyneedRTTI?.深入研究STLheader本身并没有给我答案。该代码对我来说几乎无法阅