草庐IT

c++ - 为什么 vtables 有 sizeof(void*) * 2 字节的 0x00 填充?

我想这是特定于实现的,但是对于使用libstdc++和libc++(gcc或clang)构建的armv7、arm64和x86_64,似乎vtables开头总是有8个字节(64位上为16个)的填充,并获取一个vtable通常看起来像这样:ldr.wr0,addsr0,0x8strr0,[r1];wherer1istheinstancevtable看起来像这样:vtable+0x00:0x00000000vtable+0x04:0x00000000vtable+0x08:0xfirstfuncvtable+0x0c:0xsecondfuncvtable+0x10:0xthirdfunc等.

c++ - 我可以列出核心转储中的所有 VTable 指针吗?

我有一个C++程序的核心转储,它是使用GNU工具链构建和运行的。我可以复制可执行文件也许。如何按类名找到所有vtable指针的列表? 最佳答案 您可以在编译时使用-fdump-class-hierarchy获取虚表布局。这在检查对象时可能会有所帮助。您可能需要在gdb中setprintvtblon。 关于c++-我可以列出核心转储中的所有VTable指针吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.c

c++ - "non-virtual thunk to <method name>", 引用自 : Vtable for <classname>in <objectfile. o>

在Debug模式下编译时,我的xcode编译出现以下链接错误:"",referencedfrom:Vtableforin"non-virtualthunkto",referencedfrom:Vtableforin奇怪的是:它只出现在我的一个构建目标中(该代码的两个目标几乎相同),而且如果这些方法是在头文件而不是.cpp中定义的,那么它对两者都适用目标。所有这些方法都是纯虚拟的。发生这些错误的类继承自多个类,但只有其中一个会导致这些错误。有人知道导致此错误的原因吗? 最佳答案 遇到了同样的问题。当我们定义了一个虚拟成员函数(在.h头

c++ - 奇怪的 undefined reference `vtable

我在"undefinedreferencetovtable..."中困了一整天。其实我见过很多关于"undefinedreferencetovtable..."的回答处理例如:undefinedreferencetovtable"Transaction"Undefinedreferencetovtablehttps://gcc.gnu.org/faq.html#vtablesUndefinedreferencetovtable有些人的问题是忘记写虚函数,有些人忘记将.cpp文件添加到构建目录中。但我想我已经注意到了。我想做以下步骤:我想将类A_1和A_2编译成一个共享库libA。A_2

c++ - 虚拟类的每个对象是否都有指向 vtable 的指针?

虚类的每个对象都有指向vtable的指针吗?还是只有带虚函数的基类对象才有?vtable存储在哪里?进程的代码段还是数据段? 最佳答案 所有具有虚方法的类都将拥有一个由该类的所有对象共享的vtable。每个对象实例都有一个指向该vtable的指针(这就是找到vtable的方式),通常称为vptr。编译器隐式生成代码来初始化构造函数中的vptr。请注意,这些都不是C++语言强制要求的——实现可以根据需要以其他方式处理虚拟调度。但是,这是我熟悉的每个编译器都使用的实现。StanLippman的书《深入了解C++对象模型》描述了它是如何工

c++ - 运行时的 Vtable 修改

对于那些使用vtables的编译器实现:是否存在虚拟函数表在运行时更改的情况?还是vtables只是在编译时填充,而在运行时没有执行任何操作来修改它们? 最佳答案 我不知道有任何具有多态性实现的C++ABI,它使用在运行时更改的虚拟表。无论如何,它不会很有用,因为虚拟表通常描述代码的属性(成员函数之间的关系,w.r.t.在类层次结构中的位置)并且C++代码在运行时不会改变。因为它没有用,所以会很浪费。 关于c++-运行时的Vtable修改,我们在StackOverflow上找到一个类似的

C++专访: vtable for a class with a pure virtual function

我今天被问到这个面试问题!!(这是一个非常尴尬的电话采访..):Whatisthedifferencebetweenthevtableforaclasswithvirtualfunctionsandaclasswithpurevirtualfunctions?现在,我知道C++标准没有指定任何关于vtables的内容,甚至没有指定v-table的存在......但是从理论上讲,答案是什么?我脱口而出,具有纯虚函数的类可以有一个vtable,其纯虚函数的vtable条目将指向派生类的实现。这个假设正确吗?我没有得到面试官的肯定回答。假设的编译器会为只有纯虚函数的类创建一个vtable吗?

c++ 缺少 vtable 错误

我收到一个非常奇怪的错误,与给定类构造函数和析构函数缺少vtable有关。请帮我解决这个问题。架构i386的undefinedsymbol:"vtableforA",referencedfrom:A::A()inA.oA::~MissionController()inA.oNOTE:amissingvtableusuallymeansthefirstnon-inlinevirtualmemberfunctionhasnodefinition.ld:symbol(s)notfoundforarchitecturei386clang:error:linkercommandfailedwit

c++ - 多重或虚拟继承下的类的内存布局和vtable(s)?

我正在阅读“C++对象模型内部”,试图了解如何通过vtables实现多重和虚拟继承。(我非常了解单多态性)。当需要在虚拟继承期间或强制转换期间定位方法时,我很难理解究竟做了什么,因为要执行大量的偏移计算。是否有人能够帮助理解在多重继承或虚拟继承示例中如何使用多个vtable?如果我能理解布局和问题,我可能会更好地理解这个问题。 最佳答案 C++实现通常使用vtables来实现虚函数。vtable是指向函数的指针表。具有虚函数的类的每个对象都有一个指向包含该类所有虚函数地址的vtable的隐藏指针。在调用虚函数时,代码会计算函数指针在

c++ 未定义对 vtable 的引用

我正在学习C++。我正在尝试做一个练习,我用一个函数定义一个纯虚拟类的几个实现。我在链接使用这些实现的类时遇到问题。==>BasicMath.h#includeclassBasicMath{};#endif//BASIC_MATH_H==>Operation.h#includeclassOperation{public:virtualvoidperform(std::vectorvec)=0;};#endif//OPERATION==>Sum.hvec);};#endif//SUM_H==>BasicMath.cpp#include#include#include"BasicMath.