C++继承、菱形继承、虚继承内存分析

61 阅读2分钟

1. 普通元素内存大小

int a = 0;
int* p = &a;
cout << sizeof(a) << endl;  // 4
cout << sizeof(p) << endl;  // 8

2. 继承内存大小

class A {
public:
	A(int a);
	int a;
};

A::A(int a) : a(a) {

}

class B:public A {
public:
	B(int a, int b);
	int b;
};

B::B(int a,int b) : A(a),b(b) {

}

int main() {
	A a(1);
	B b(1, 2);
	cout << sizeof(a) << endl;  // 4
	cout << sizeof(b) << endl;  // 8
}

3. 菱形继承内存大小


class A {
public:
	A(int a);
	int a;
};

A::A(int a) : a(a) {

}

class B:public A {
public:
	B(int a, int b);
	int b;
};

B::B(int a,int b) : A(a),b(b) {

}

class C :public A {
public:
	C(int a, int c);
	int c;
};

C::C(int a, int c) : A(a), c(c) {

}

class D :public B, public C {
public:
	D(int a, int b, int c, int d);
	int d;
};

D::D(int a, int b, int c, int d) : B(a, b), C(a+10, c), d(d) {

}

A a(1);
B b(1, 2);
C c(1, 3);
D d(1, 2, 3, 4);
cout << sizeof(a) << endl;  // 4
cout << sizeof(b) << endl;  // 8
cout << sizeof(c) << endl;  // 8
cout << sizeof(d) << endl;  // 20  a a b c d
cout << d.A::a << " " << d.b << " " << d.c << " " << d.d << endl; // 1 2 3 4
// 默认使用b作用域的a
cout << d.A::a << " " << d.b << " " << d.C::a << " " << d.c << " " << d.d << endl; // 1 2 11 3 4
// 获取C作用域下的a
cout << d.A::a << " " << d.b << " " << d.C::A::a << " " << d.c << " " << d.d << endl; // 1 2 11 3 4
// 这样更明显

4. 虚继承内存大小

class A {
public:
	A(int a);
	int a;
};

A::A(int a) : a(a) {

}

class B:virtual public A {
public:
	B(int a, int b);
	int b;
};

B::B(int a,int b) : A(a),b(b) {

}

class C :virtual public A {
public:
	C(int a, int c);
	int c;
};

C::C(int a, int c) : A(a), c(c) {

}

class D :public B, public C {
public:
	D(int a, int b, int c, int d);
	int d;
};

D::D(int a, int b, int c, int d) : A(0), B(a, b), C(a+10, c), d(d) {

}

A a(1);
B b(1, 2);
C c(1, 3);
D d(1, 2, 3, 4);
cout << sizeof(a) << endl;  // 4             
cout << sizeof(b) << endl;  
// 24 4+4+8 (内存对齐)     32位下是12(4+4+4) (两个int,一个指针)
cout << sizeof(c) << endl;  
// 24 4+4+8 (内存对齐)     32位下是12(4+4+4)
cout << sizeof(d) << endl;  
// 48 4*4 + 8 + 8  (内存对齐) 32位下是24(4*4+4+4)
// (4个int,a不重复,两个指针)
cout << d.A::a << " " << d.b << " " << d.c << " " << d.d << endl; // 0 2 3 4
// 默认使用b作用域的a
cout << d.A::a << " " << d.b << " " << d.C::a << " " << d.c << " " << d.d << endl; // 0 2 0 3 4
// 获取C作用域下的a
cout << d.A::a << " " << d.b << " " << d.C::A::a << " " << d.c << " " << d.d << endl; // 0 2 0 3 4
// b、c作用域下没有单独的a,目前只有一个a(即0)