0%

C++:Virtual Table

本文旨在分析C++中虚函数的实现细节,着重于class类内部的内存空间分布
对以下类,其内存空间分布为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A{
public:
int a;
long long b;
}
A t;
sizeof(t) = 16
&t = &t.a = base;
&t.b = base + 0x8;

high<---|---------| ->base + 0x10
| ll |
|---------| ->base + 0x8
| |int |
low<----|---------| ->base

若它有一个虚函数,则其内存空间分布为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A{
public:
int a;
long long b;
virtual void vfun() {};

}
sizeof(A) = 24;

high<---|---------| ->base + 0x18
| ll |
|---------| ->base + 0x10
| |int |
|---------| ->base + 0x8 vtable
| void** | ->vfptr:0x7FF684A63308 ---->|----------|
low<----|---------| ->base | void* |->0x7FF684A61070 -> vfun1
|----------|
| void* |->0x7FF684A610B0 -> vfun2
|----------|