C++对象模型:类的大小

参考以下博文:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//以下测试环境为GCC 32bit-Release模式
#include<iostream>
using namespace std;
class A {};
class B {};
class C : public A {
virtual void c_fun()=0;
};
class D : public B, public C {};
int main() {
cout<<"sizeof(A):"<<sizeof(A)<<endl;
cout<<"sizeof(B):"<<sizeof(B)<<endl;
cout<<"sizeof(C):"<<sizeof(C)<<endl;
cout<<"sizeof(D):"<<sizeof(D)<<endl;
return 0;
}
/*
* 结果为: 1 1 4 4
* 最后一个可能与编译器有关,可能8
*/
#include<iostream>
using namespace std;
class A {
private:
int data;
};
class B {
private:
int data;
static int data1;
};
int B::data1=0;
//注:void main()会编译报错
main() {
cout<<"sizeof(A) = "<< sizeof(A) <<endl;
cout<<"sizeof(B) = "<< sizeof(B) <<endl;
}
/*
* 结果为: 4 4
*/
#include<iostream>
using namespace std;
class A {
public :
A(int a) {
a=x;
}
void f(int x) {
cout<<x<<endl;
}
~A() {}
private:
int x;
int g;
};
class B {
public:
private:
int data;
int data2;
static int xs;
};
int B::xs=0;
int main() {
A s(10);
s.f(10);
cout << "sizeof(a): "<< sizeof(A) << endl;
cout << "sizeof(b): "<< sizeof(B) << endl;
}
/*
* 结果为: 8 8
*/
#include<iostream>
using namespace std;
class X {};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};
// 上述为经典的钻石继承
int main() {
cout << "sizeof(X): " << sizeof(X) << endl;
cout << "sizeof(Y): " << sizeof(Y) << endl;
cout << "sizeof(Z): " << sizeof(Z) << endl;
cout << "sizeof(A): " << sizeof(A) << endl;
return 0;
}
/*
* 结果为: 1 4 4 8
*/
#include<iostream>
using namespace std;
class X {
int a;
};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};
// 上述为经典的钻石继承
int main() {
cout << "sizeof(X): " << sizeof(X) << endl;
cout << "sizeof(Y): " << sizeof(Y) << endl;
cout << "sizeof(Z): " << sizeof(Z) << endl;
cout << "sizeof(A): " << sizeof(A) << endl;
return 0;
}
/*
* 结果为: 4 8 8 12
*/
#include<iostream>
using namespace std;
class X {
int a;
virtual void fun()=0;
};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};
// 上述为经典的钻石继承
int main() {
cout << "sizeof(X): " << sizeof(X) << endl;
cout << "sizeof(Y): " << sizeof(Y) << endl;
cout << "sizeof(Z): " << sizeof(Z) << endl;
cout << "sizeof(A): " << sizeof(A) << endl;
return 0;
}
/*
* 结果为: 8 12 12 16
*/