草庐IT

c++ - 编程语言理念 : Avoiding vtable lookups

很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visitthehelpcenter.关闭9年前。一段时间以来,我一直在考虑一种编程语言的想法:它在语法上基本上是C++和Java类的,用于系统编程(或者实际上任何需要高性能的编程),但是,在我看来,这是一种比C++更有趣的语法。我在考虑如何处理分层类结构中的虚拟方法(我的语言不包括多重继承),以及避免vtable查找的方法。我的问题是双重的:据我了解,vtable查找如此影响性能的原因(至少在游戏开发等时间紧迫的场景中)是因为它需要引用对象vt

c++ - 完全纯虚拟类的 Vtable 放置

根据我对C++规范的(有限)了解,具有虚拟成员的类的vtable放在第一个非纯非内联虚拟方法的定义处。编译器如何处理从具有所有纯虚拟方法(例如接口(interface))的类继承的类?这种情况下vtable放在哪里? 最佳答案 vtable存储已实现的虚拟方法的地址。如果一个类的所有方法都是纯虚的并且没有实现,则不需要生成vtable。如果没有从它派生的一些类并实现这些方法,您将无法使用这样的类。每个实现了虚方法的类都有自己的单个虚表,其中包含所有虚方法的地址:它不以任何方式引用基类的虚表;地址重复。所以如果你有一个继承自另一个类的

c++ - 为什么 Vtables 在嵌入式平台上没有被正确实现?

我正在为嵌入式系统(特别是PSoC5,使用PSoCCreator)开发代码,并使用C++编写代码。虽然我已经克服了使用C++的大部分障碍,但首先使用编译器标志-xc++在C++中进行编译,定义new和delete运算符,确保不会抛出异常编译器标志-fno-exception,在使用虚函数时我遇到了障碍。如果我尝试声明一个虚函数,编译器会给我错误undefinedreferenceto"vtablefor__cxxabiv1::__class_type_info"。解决这个问题的唯一方法是使用编译器标志-fno-rtti,它可以防止错误并使其编译成功。但是,如果我这样做,嵌入式程序会在尝

c++ - 抽象类未定义对`vtable for的引用的生成器错误

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Undefinedsymbols“vtablefor…”and“typeinfofor…”?C++UndefinedReferencetovtableandinheritance我的大学要求我完成一个小项目,但遇到了问题。这是一个简单的象棋游戏项目。我有一个模糊的错误undefinedreferenceto`vtableforXXX当我从抽象类定义继承类时...这是代码Pieces.hclassPieces{public:Pieces(charcolor):pieceColor(color){}virtual

c++ - 未定义的 vtable 引用,Linux 中的 Qt

我试图在Ubuntu10.04中的Code::Blocks下编译Qt和OpenGL程序。我得到“对GLWidget的vtable的undefinedreference”#ifndef_GLWIDGET_H#define_GLWIDGET_H#include#include"stdlib.h"classGLWidget:publicQGLWidget{Q_OBJECT//mustincludethisifyouuseQtsignals/slotspublic:GLWidget(QWidget*parent=0);~GLWidget();protected:voidinitializeGL

c++ - 是否可以使用 static_cast 避免 vtable 开销?

这是我的问题。我有一个基类和一个派生类,它覆盖了基类中的一些方法。为简单起见,请考虑以下示例:structbase{virtualvoidfn(){/*basedefinitionhere*/}};structderived:base{voidfn(){/*deriveddefinitionhere*/}};在我的实际程序中,这些类作为参数传递给其他类并在其他方法中调用,但为了简单起见,让我们创建一个简单的函数,将基类或派生类作为参数。我可以简单地写voidcall_fn(base&obj){obj.fn();}并且由于虚函数的缘故,对适当函数的调用将在运行时解析。但是,我担心如果ca

c++ - 强制虚拟方法表中的函数顺序?

如何控制虚拟表中虚拟函数的顺序?它们的排列顺序是否与声明的顺序相同?当继承一个带有虚表的类时,被继承类的虚表是基类的扩展,还是只用继承类的虚函数创建的全新虚表。(即虚拟表是否仍在类的索引+0x0处?) 最佳答案 (a)就标准而言,你不能,(事实上你甚至不能假设vtables存在)。(b)可能吧,但是在什么情况下你需要控制顺序,但是你自己查不到呢?检查的方法是查看虚拟调用的反汇编(并找到添加到vtable指针的偏移量以获得调用地址)或查看vtable本身的反汇编。视情况而定。对于单继承,可能它是基类的扩展,每个对象的索引0指向该类的一

c++ - 为什么我得到 "Undefined symbols ... typeinfo ... vtable"与虚拟和具体类?

我正在重新学习C++(意思是:对我温柔一点!:)。我有一个父类(superclass)(Node),它有一个必须在子类(TestNode)中实现的抽象方法(step())。它编译没有错误,也没有任何警告,但链接它会导致:bash-3.2$g++-Wall-o./bin/t1src/t1.cppUndefinedsymbolsforarchitecturex86_64:"typeinfofortest::Node",referencedfrom:typeinfofortest::TestNodeint1-9f6e93.o"vtablefortest::Node",referencedfr

c++ - 为什么 vtable 不能包含重复的函数?

想象一个项目,其中有一个如下所示的接口(interface)类:structInterface{virtualvoidf()=0;virtualvoidg()=0;virtualvoidh()=0;};假设在其他地方,有人希望创建一个实现此接口(interface)的类,f、g、h都做同样的事情structS:Interface{virtualvoidf(){}virtualvoidg(){f();}virtualvoidh(){f();}};然后为S生成一个vtable将是一个有效的优化,其条目都是指向S::f的指针,从而节省了对包装函数的调用g和h。然而,打印vtable的内容表明

c++ - 对模板的`vtable 的 undefined reference

我有一个继承自接口(interface)类的模板类,因此具有虚函数//abstract.hclassAbstract{virtualvoidabc();Abstract();}//Abstract.cppAbstract::Abstract(){//dosomeinit}//concrete.hclassImpl{public:voidabcImpl();};templateclassConcrete:publicAbstract,publicT{virtualvoidabc();};templateConcrete::abc(){static_cast(*this).abcImpl(