x64环境下实现:
1 #include <iostream>
2
3 using namespace std;
4
5 class kong{
6
7 };
8
9 class kong1{
10
11 };
12
13 class kong2{
14
15 };
16
17 class data2
18 {
19 int a; //4个字节
20 char s;
21 };
22
23 class data3
24 {
25 int a;
26 char s;
27 virtual void kong(); //在64位系统分配指针大小为8字节
28 virtual void kong1();
29 };
30
31 class data4 : public data3
32 {
33
34 };
35
36 class data5 : virtual public data3
37 {
38
39 };
40
41 class data6 : public data3
42 {
43 virtual void kong();
44 };
45
46 class data7 : virtual public data3
47 {
48 virtual void kong();
49 };
50
51 class data8 : public data2
52 {
53 virtual void kong();
54 };
55
56 class data9 : public data2
57 {
58
59 };
60
61 class data10 : virtual public data2
62 {
63 virtual void kong();
64 };
65
66 class data11 : virtual public data2
67 {
68
69 };
70
71 int main()
72 {
73 //c++要求每个实例在内存中都有独一无二的地址。空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1
74 kong ko;
75 cout << sizeof(ko) << " " << sizeof(kong) << endl;
76
77 //包含了对齐,64位int型4个字节
78 data2 da;
79 cout << sizeof(da) << " " << sizeof(data2) << endl;
80
81 //C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节,在64位系统分配指针大小为8字节。无论多少个虚函数,只有这一个指针,8字节
82 cout << sizeof(data3) << endl;
83
84 //data3类(包含virtual),data4(不包含virtual)直接继承data3 输出为16, C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在64位系统分配指针大小为8字节。无论多少个虚
85 //函数,只有这一个指针,8字节。并且子类的大小是本身成员变量的大小加上父类的大小。 父类16 子类0
86 cout << sizeof(data4) << endl;
87
88 //若data5(不包含virtual)虚继承data3, 输出为24, 父类16加上子类的virtual(8),指针8
89 cout << sizeof(data5) << endl;
90
91 //data3类(包含virtual),data6(包含virtual)直接继承data3 输出为16, 原因:如果子类直接继承父类,他们是共享一个虚函数指针
92 cout << sizeof(data6) << endl;
93
94 //若是data7(包含virtual)虚继承data3,输出为24, 父类16,子类虚函数指针8 输出24
95 cout << sizeof(data7) << endl;
96
97 //data2类(不包含virtual),data8(包含virtual)直接继承 输出为16, 父类为8 子类虚函数指针8 输出为16
98 cout << sizeof(data8) << endl;
99
100 //若data9(不包含virtual)直接继承data2类(不包含virtual),输出为8, 父类8 子类0 输出8
101 cout << sizeof(data9) << endl;
102
103 //data10(包含virtual)虚继承data2类(不包含virtual), 输出为 24, 父类为8 ,虚基类指针为8,子类虚函数指针8 输出为24
104 cout << sizeof(data10) << endl;
105
106 //data11(不包含virtual)虚继承data2类(不包含virtual), 输出为 16, 父类为8 ,虚基类指针为8, 输出为16
107 cout << sizeof(data11) << endl;
108
109
110 //如果有多个virtual函数,只有一个指针
111 //若子类虚继承,则子类有自己的一个虚函数指针
112 //子类直接继承父类,若父中由virtual,则父子共享一个指针用来指定虚函数的虚拟函数表的入口地址
113
114 return 0;
115 }
结果(单位:字节):
原文链接: https://www.cnblogs.com/Jace-Lee/p/5869220.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/240452
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!