c++ - 内存中的虚拟表布局?

标签 c++ vtable

虚拟表是如何存储在内存中的?他们的布局?

例如

class A{
    public:
         virtual void doSomeWork();
};

class B : public A{
    public:
         virtual void doSomeWork();
};

A类和B类的虚表在内存中会如何布局?

最佳答案

对于 Linux 中的 GCC 编译器,运行:

g++ -fdump-class-hierarchy example.h

输出是:

Vtable for A
A::_ZTV1A: 3u entries
0     (int (*)(...))0
8     (int (*)(...))(& _ZTI1A)
16    (int (*)(...))A::doSomeWork

Class A
   size=8 align=8
   base size=8 base align=8
A (0x7fb76785a4e0) 0 nearly-empty
    vptr=((& A::_ZTV1A) + 16u)

Vtable for B
B::_ZTV1B: 3u entries
0     (int (*)(...))0
8     (int (*)(...))(& _ZTI1B)
16    (int (*)(...))B::doSomeWork

Class B
   size=8 align=8
   base size=8 base align=8
B (0x7fb7678510d0) 0 nearly-empty
    vptr=((& B::_ZTV1B) + 16u)
  A (0x7fb76785a540) 0 nearly-empty
      primary-for B (0x7fb7678510d0)

Also I've created the vtable-dumper tool to list contents of virtual tables in the shared objects. With this tool you don't need to compile headers, just run it on the object:

vtable-dumper SHLIB

关于c++ - 内存中的虚拟表布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1342126/

相关文章:

c++ - 用结构修改 protected 值

c++ - 返回对类数据成员的引用,然后尝试更改该成员

c++ - 使用CStringW/CStringA和CT2W/CT2A转换字符串有什么区别?

Android,ADB,将 STDOUT 重定向到套接字

c++ - 虚函数机制引用虚构造函数

c++ 虚函数 vs 成员函数指针(性能比较)

c++ - 了解 C++ vtable 和 RTTI

c++ - 我的三角三元组程序有问题

c++ - 从内存中绘制位图

c++ - 通过对象指针调用析构函数