草庐IT

没有 libstdc++ 的 C++ RTTI。可能吗?

我想研究如何在没有libstdc++但支持rtti的情况下链接C++程序。我尝试按照下面描述的方式编译它。我可以在示例中定义任何必要但不存在的符号,如函数strcmp,但是是否可以在没有显式mangle/demangle魔法的情况下定义typeinfo符号?如果可能的话,怎么做?cd/tmp&&catrtti.cpp&&g++-nodefaultlibs-lcrtti.cppextern"C"intstrcmp(constchar*s1,constchar*s2){return0;};#include"typeinfo"intmain(){returntypeid(int)==type

C++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象

我目前正致力于在非RTTI平台(Android)上集成使用大量RTTI内容的第三方包。基本上,我自己实现了RTTI,但遇到了一个问题。问题是很多类都有菱形继承问题,因为所有类都派生自同一个基类(对象)。所以,如果我想从基类向下转换为派生类,我必须使用dynamic_cast-但RTTI不可用!没有dynamic_cast的虚拟继承时,如何将对象从父对象转换为子对象?看起来是这样的:classA{public:virtualchar*func(){return"A";};};classB:publicvirtualA{public://virtualchar*func(){return"

C++ - 在没有 RTTI/dynamic_cast 的情况下向下转换菱形继承对象

我目前正致力于在非RTTI平台(Android)上集成使用大量RTTI内容的第三方包。基本上,我自己实现了RTTI,但遇到了一个问题。问题是很多类都有菱形继承问题,因为所有类都派生自同一个基类(对象)。所以,如果我想从基类向下转换为派生类,我必须使用dynamic_cast-但RTTI不可用!没有dynamic_cast的虚拟继承时,如何将对象从父对象转换为子对象?看起来是这样的:classA{public:virtualchar*func(){return"A";};};classB:publicvirtualA{public://virtualchar*func(){return"

c++ - C++ 中的 RTTI 开销

在C++程序中启用RTTI会产生哪些内存/性能开销?任何人都可以在RTTI机制的内部实现和相关开销之间进行一些说明吗?我确实了解如何通过typeid和dynamic_cast使用RTTI,我想知道的是运行时如何跟踪此信息以及它如何跟踪的内部实现细节是开销吗? 最佳答案 启用RTTI通常只会带来很小的开销。通常的实现带有一个指向对象vtable中类型信息结构的指针。由于无论如何都必须构造vtable,因此额外的时间很少-这就像在类中添加另一个虚函数一样。typeid因此相当于调用虚函数。dynamic_cast较慢-它需要遍历继承层次

c++ - C++ 中的 RTTI 开销

在C++程序中启用RTTI会产生哪些内存/性能开销?任何人都可以在RTTI机制的内部实现和相关开销之间进行一些说明吗?我确实了解如何通过typeid和dynamic_cast使用RTTI,我想知道的是运行时如何跟踪此信息以及它如何跟踪的内部实现细节是开销吗? 最佳答案 启用RTTI通常只会带来很小的开销。通常的实现带有一个指向对象vtable中类型信息结构的指针。由于无论如何都必须构造vtable,因此额外的时间很少-这就像在类中添加另一个虚函数一样。typeid因此相当于调用虚函数。dynamic_cast较慢-它需要遍历继承层次

c++ - 使用 GCC 编译没有 RTTI 的时间 typeid

有没有办法获得编译时间typeid来自禁用RTTI的GCC的信息?在VisualStudio下,像constchar*typeName=typeid(int).name();这样的简单命令将适本地返回“int”,即使RTTI被禁用。不幸的是,GCC不能这样做。当我尝试调用typeid没有RTTI,我的程序会崩溃。我知道禁用RTTI不是标准的一部分,但无论如何我可以强制GCC对已知类型进行编译时解析吗?出于性能原因,RTTI被禁用。我不需要运行时RTTI。编辑:这就是我最终的结果:templateconstchar*TypeName(void);templateconstchar*Typ

c++ - 使用 GCC 编译没有 RTTI 的时间 typeid

有没有办法获得编译时间typeid来自禁用RTTI的GCC的信息?在VisualStudio下,像constchar*typeName=typeid(int).name();这样的简单命令将适本地返回“int”,即使RTTI被禁用。不幸的是,GCC不能这样做。当我尝试调用typeid没有RTTI,我的程序会崩溃。我知道禁用RTTI不是标准的一部分,但无论如何我可以强制GCC对已知类型进行编译时解析吗?出于性能原因,RTTI被禁用。我不需要运行时RTTI。编辑:这就是我最终的结果:templateconstchar*TypeName(void);templateconstchar*Typ

c++ - 使用 RTTI 确定 C++ 中的继承图?

如果有的话,有什么C++构造用于在运行时列出类的祖先?基本上,我有一个类,它存储指向任何对象的指针,可能包括原始类型(有点像boost::any,我不想使用它,因为我需要保留对象的所有权)。在内部,这个指针是void*,但是这个类的目标是包装void*具有运行时类型安全性。赋值运算符是模板化的,所以在赋值时我取typeid()传入指针并存储它。然后当我稍后回退时,我可以检查typeid()针对存储的type_info的强制转换类型.如果不匹配,强制转换将抛出异常。但是有一个问题:我似乎失去了多态性。假设B是D的基数.如果我存储指向D的指针在我的类里面,然后存储type_info也将是D

c++ - 使用 RTTI 确定 C++ 中的继承图?

如果有的话,有什么C++构造用于在运行时列出类的祖先?基本上,我有一个类,它存储指向任何对象的指针,可能包括原始类型(有点像boost::any,我不想使用它,因为我需要保留对象的所有权)。在内部,这个指针是void*,但是这个类的目标是包装void*具有运行时类型安全性。赋值运算符是模板化的,所以在赋值时我取typeid()传入指针并存储它。然后当我稍后回退时,我可以检查typeid()针对存储的type_info的强制转换类型.如果不匹配,强制转换将抛出异常。但是有一个问题:我似乎失去了多态性。假设B是D的基数.如果我存储指向D的指针在我的类里面,然后存储type_info也将是D

c++ - 从动态类型信息创建新对象

在C++中,有没有办法查询对象的类型,然后使用该信息动态创建相同类型的新对象?例如,假设我有一个简单的3类层次结构:classBaseclassFoo:publicBaseclassBar:publicBase现在假设我给你一个转换为Base类型的对象——它实际上是Foo类型。有没有办法查询类型并使用该信息稍后创建Foo类型的新对象? 最佳答案 克隆方法查询类型的语言没有提供任何东西并允许您根据该信息进行构造,但您可以通过各种方式为您的类层次结构提供功能,其中最简单的方法是使用虚拟方法:structBase{virtual~Base