C++类和对象的内存布局

用g++查看内存布局的方法:

  g++ 版本>8.0:g++ -fdump-lang-class vptr.cpp   g++ 版本<8.0:g++ -fdump-class-hierarchy vptr.cpp 参考:https://blog.csdn.net/Ineedapassward/article/details/118417116

类的内存布局

参考:https://blog.csdn.net/shichao1470/article/details/91563282

菱形继承下对象的内存布局

参考:https://blog.csdn.net/j4ya_/article/details/80177897

菱形继承下类的内存布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

class Base{
public:
virtual void func(){
cout<<"Base::func()"<<endl;
}
};

class X: virtual public Base{
void func(){
cout<<"X::func()"<<endl;
}
};

class Y: virtual public Base{
void func(){
cout<<"Y::func()"<<endl;
}
virtual void funcY(){}
};
class Z: public X, public Y{
void func(){
cout<<"Z::func()"<<endl;
}
};



int main(int argc, char *argv[])
{
cout<<sizeof(Base)<<endl
<<sizeof(X)<<endl
<<sizeof(Y)<<endl
<<sizeof(Z)<<endl ;

return 0;
}

64位系统下运行,sizeof(int *) 等于8,输出结果为:

1
2
3
4
8
8
8
16

问题:   类Base的size为8,是因为有一个虚表指针,   类X和类Y的size也为8,也是因为各自只有一个虚表指针?   类Z的size为16,是为甚?不采用虚继承的时候结果不变,为甚? 使用g++ 查看内存布局,结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Vtable for Z
Z::_ZTV1Z: 6 entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI1Z)
16 (int (*)(...))Z::func
24 (int (*)(...))-8
32 (int (*)(...))(& _ZTI1Z)
40 (int (*)(...))Z::_ZThn8_N1Z4funcEv

Class Z
size=16 align=8
base size=16 base align=8
Z (0x0x3feb780) 0
vptr=((& Z::_ZTV1Z) + 16)
X (0x0x3feb7c0) 0 nearly-empty
primary-for Z (0x0x3feb780)
Base (0x0x3fdca48) 0 nearly-empty
primary-for X (0x0x3feb7c0)
Y (0x0x3feb800) 8 nearly-empty
vptr=((& Z::_ZTV1Z) + 40)
Base (0x0x3fdca80) 8 nearly-empty
primary-for Y (0x0x3feb800)

为啥

1
2
3
4
Y (0x0x3feb800) 8 nearly-empty
vptr=((& Z::_ZTV1Z) + 40)
Base (0x0x3fdca80) 8 nearly-empty
primary-for Y (0x0x3feb800)

这里是什么东西啊?


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!