虚拟表如何存储在内存中?他们的布局?
例如
class A{
public:
virtual void doSomeWork();
};
class B : public A{
public:
virtual void doSomeWork();
};
Run Code Online (Sandbox Code Playgroud)
内存中A类和B类虚拟表的布局如何?
lin*_*ild 30
对于Linux中的GCC编译器运行:
g++ -fdump-class-hierarchy example.h
Run Code Online (Sandbox Code Playgroud)
输出是:
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)
我还创建了vtable-dumper工具来列出共享对象中虚拟表的内容.使用此工具,您无需编译标头,只需在对象上运行它:
vtable-dumper SHLIB
Run Code Online (Sandbox Code Playgroud)
小智 11
正如其他人所说,这是依赖编译器的,而不是你在日常使用C++时真正需要考虑的事情.但是,如果您只是对这个问题感到好奇,那么您应该阅读Stan Lippman的书" Inside the C++ Object Model".
内存中的vtable布局完全依赖于编译器; 没有采取"正确"或普遍的方法.
| 归档时间: |
|
| 查看次数: |
15486 次 |
| 最近记录: |