15得票2回答
多重虚拟继承中的虚拟表和内存布局

考虑以下层次结构:struct A { int a; A() { f(0); } A(int i) { f(i); } virtual void f(int i) { cout << i; } }; struct B1 : virtual A { i...

15得票3回答
接口vtable

接口(仅具有纯虚函数的多态类)是否具有虚表? 由于接口本身不实现多态函数且无法直接构造,因此链接器无需放置虚表。这样是吗?我特别关注MSVC编译器。

14得票4回答
Win32调试构建中,什么原因会导致VTable指针为0xdddddddd?

我正在调试一个问题,并将其缩小到对象的虚函数表指针为 0xdddddddd。 这个答案表明Win32 debug builds通常会将已被删除或未使用的内存设置为这个特殊值。 注意,指针本身看起来是有效的,只是虚函数表指针是 0xdddddddd。 这是一段代码片段:std::list&l...

14得票3回答
如何确定一个C++类是否有虚函数表?

我的一个朋友今天早些时候向我发出了以下挑战: 给定以下代码,请提出 OBJECT_HAS_VTABLE 的一种实现,使程序打印 "AnObject has a vtable = 0, AnObjectWithVTable has a vtable = 1"。 class AnObject ...

14得票3回答
C++面试题:一个含有纯虚函数的类的vtable

我今天在一次非常尴尬的电话面试中被问到了这个问题: 一个拥有虚函数的类和一个拥有纯虚函数的类之间有何不同? 现在,我知道C++标准并没有具体规定vtable,甚至也没有规定v-table的存在...但从理论上讲,答案应该是什么呢? 我脱口而出,一个拥有纯虚函数的类可以有vtabl...

13得票3回答
如果对象被转换为它们的实际类型,使用虚函数是否会产生任何费用?

我的理解是,虚函数会因为两个问题导致性能问题:vtable引起的额外解引用和编译器无法在多态代码中内联函数。 如果我将变量指针向下转换为其确切类型,那么是否仍然存在额外的成本? class Base { virtual void foo() = 0; }; class Derived : ...

13得票2回答
如果一个虚函数从一个虚基类继承,那么“虚thunk”是什么?

当我尝试访问从虚拟基类继承的派生类对象的内存布局时,出现了一些问题。编程环境:GNU/Linux 3.19.0-32-generic,x86_64编译器:gcc 4.8.4//virtual base class class Base { public : virtual void f...

13得票2回答
运行时的Vtable修改

对于使用虚函数表(vtable)的编译器实现,是否存在虚函数表在运行时更改的情况? 或者 vtable 只在编译时填充,运行时不执行任何修改操作?

13得票9回答
虚拟类的每个对象都有一个指向虚函数表的指针吗?

每个虚类对象都有一个指向虚函数表的指针吗? 或者只有具有虚函数的基类对象才有? vtable 存储在哪里?代码段还是进程的数据段?

13得票6回答
内存中的虚拟表布局?

如何在内存中存储虚拟表?它们的布局是怎样的? 例如:class A{ public: virtual void doSomeWork(); }; class B : public A{ public: virtual void doSom...