C++ class size

C++ class size

首先来看这个:

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
#include <iostream>

using namespace std;

class EmptyClass {

};

class intClass {
private:
int i;
};

class deriveClass : public intClass {

};

class AbstractClass {
public:
virtual void func() = 0;
};

class NotAbstractClass {
public:
void func();
};

class WithStaticClass {
public:
static int i;
void func();
};

class CharClass {
public:
char c[7];
};

int main()
{
cout << "EmptyClass size: " << sizeof(EmptyClass) << endl;
cout << "intClass size: " << sizeof(intClass) << endl;
cout << "deriveClass size: " << sizeof(deriveClass) << endl;
cout << "AbstactClass size: " << sizeof(AbstractClass) << endl;
cout << "NotAbtractClass size: " << sizeof(NotAbstractClass) << endl;
cout << "WithStatic size: " << sizeof(WithStaticClass) << endl;
cout << "CharClass size: " << sizeof(CharClass) << endl;
}

//结果:
/*
EmptyClass size: 1
intClass size: 4
deriveClass size: 4
AbstactClass size: 8
NotAbtractClass size: 1
WithStatic size: 1
CharClass size: 7
*/

类的大小有几点规则:

  • 为类的成员变量大小之和,同时需要满足一些对齐要求(例如上面的例子中对齐为1个字节)

  • 编译器额外加入的大小,例如虚函数的指针,虚继承,多重继承

  • 与类的构造析构和成员函数无关

  • 继承计算大小时会把私有变量计算在内

注意

1
2
3
4
5
6
class AbstractClass {
public:
virtual void func() = 0;
char c[3];
};
//结果为16
  • 虚继承:虚继承除了加上父类的大小之外,还需要一个指针指向虚基类,同时考虑对齐,例如:
1
2
3
4
5
6
7
8
9
class intClass {
private:
int i;
};

class deriveClass : virtual intClass {

};
//结果是16