C++ | class size

c++类大小和机器还有编译器有关。64位机器指针大小为8个字节,32位机器为4个字节。

  1. 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址;
  2. 有虚函数的类有个virtual table(虚函数表),里面包含了类的所有虚函数,类中有个virtual table pointers,通常成为vptr指向这个virtual table;
  3. 有多个父类的,会维护多个虚函数指针,第一个指向第一个基类的虚函数表(并且带上在类中定义的虚函数),第二个指针指向第二个基类的虚函数表...以此类推。
  4. 虚继承,还有一个指向父类的指针,该指针为指向虚基类的指针(Pointer to virtual base class);
 1 #include <iostream>

 2 

 3 using namespace std;

 4 

 5 class A {};

 6 

 7 class B {};

 8 

 9 class C : public A {

10     virtual void func() = 0;

11 };

12 

13 class D : public B, public C {};

14 

15 class E {

16 public:

17     virtual void e() {};    

18 private:

19     char abc[3];

20 };

21 

22 class F : public E {

23 public:

24     virtual void f() {};

25 };

26 

27 class G : virtual public E {};

28 

29 class H {

30 public:

31     virtual void h() {};

32 private:

33     char abc[3];

34 };

35 

36 class I : public E, public H {};

37 

38 class J : virtual public E {};

39 

40 class K : public G, public J {};

41 

42 class L {

43     static int l;

44     static void la() { static int m; }

45 };

46 

47 int main() {

48     cout << "sizeof(A) = " << sizeof(A) << endl; // 空类,大小为1

49     cout << "sizeof(B) = " << sizeof(B) << endl; // 空类,大小为1

50     cout << "sizeof(C) = " << sizeof(C) << endl; // 虚函数表指针 (64位机器指针为8个字节)

51     cout << "sizeof(D) = " << sizeof(D) << endl; // 虚函数表指针

52     cout << "sizeof(E) = " << sizeof(E) << endl; // 字节对齐+虚函数表指针(8 + 8)

53     cout << "sizeof(F) = " << sizeof(F) << endl; // 同E

54     cout << "sizeof(G) = " << sizeof(G) << endl; // 虚继承,还包含一个父类的指针,所以是父类指针 + 虚函数表指针 + 字节对齐 = 24

55     cout << "sizeof(H) = " << sizeof(H) << endl; // 同E

56     cout << "sizeof(I) = " << sizeof(I) << endl; // 两个虚函数指针分别指向E和H + 两个数组字节对齐 = 32

57     cout << "sizeof(J) = " << sizeof(J) << endl; // 同G

58     cout << "sizeof(K) = " << sizeof(K) << endl; // 一个指向父类(E)的指针 + 两个虚函数指针分别指向G和J + 一个字节对齐 = 32

59     cout << "sizeof(L) = " << sizeof(L) << endl; // 静态变量不占空间

60     return 0;

61 }

输出:

 1 sizeof(A) = 1

 2 sizeof(B) = 1

 3 sizeof(C) = 8

 4 sizeof(D) = 8

 5 sizeof(E) = 16

 6 sizeof(F) = 16

 7 sizeof(G) = 24

 8 sizeof(H) = 16

 9 sizeof(I) = 32

10 sizeof(J) = 24

11 sizeof(K) = 32

12 sizeof(L) = 1

 

你可能感兴趣的:(Class)