c++内存布局

class A { };
class B {public:
	int bi;
	virtual void func0() {  }
};
class C{public:
	char c;
	int ci;
	virtual void func() {  }
	virtual void func1() {  }
};
class D : public C{public:
	int di;
	virtual void func() {  }
	virtual void func1() {  }
	virtual void func3() {  }
};
class E : public B, public C {public:
	int ei;
	virtual void func0() {  }
	virtual void func1() {  }
	virtual void func2() {  }
};
B b;C c;D d;E e;
void  main(){
	std::cout << "B : " << sizeof(B) << "   b: " << &b << " b.bi " << &b.bi << std::endl;
	std::cout << "C : " << sizeof(C) << "  c: " << &c << " c.c " << (void*)&c.c << " c.ci " << &c.ci << std::endl;
	std::cout << "D : " << sizeof(D) << "  d: " << &d << " d.c " << (void*)&d.c << " d.ci " << &d.ci << " d.di " << &d.di << std::endl;
	std::cout << "E : " << sizeof(E) << "  e: " << &e << " e.bi " << &e.bi << " e.c " << (void*)&e.c << " e.ci " << &e.ci << " e.ei " << &e.ei << std::endl;
输出结果
//根据输出的地址以及对象的声明顺序,可知全局数据块的内存增长顺序,向上增长
B : 8   b: 001C236C b.bi 001C2370		//b只含有一个bi ,而bi不是b的首地址,首地址存的vptr,4个字节大小
C : 12  c: 001C2374 c.c 001C2378 c.ci 001C237C	//c同上
D : 16  d: 001C2380 d.c 001C2384 d.ci 001C2388 d.di 001C238C	//d的首地址存的虚表指针(继承的和自己的都一张表中),然后C的成员
E : 24  e: 001C2390 e.bi 001C2394 e.c 001C239C e.ci 001C23A0 e.ei 001C23A4
//E的 首先继承b的虚函数的虚表指针,b的成员,继承自C的虚函数的虚表指针,C的成员,E的成员   ,自己的虚函数丢哪张表呢?

由地址各个类和其成员的地址可知

a.单继承的类的对象(含虚函数的)的内存分布是
	(1).第一个地址存的是 **继承自基类的虚函数的表指针**
	(2).后面跟的是 **基类的成员变量**
	(3).然后是**派生类的成员变量**

b.多重继承的类的内存分布是
	(1).第一个地址是 **继承自基类的虚函数的表指针**
	(2).后面是**基类的成员变量**
	(3).然后**第二个继承自基类的虚函数的表指针**
	(4).然后**第二个基类的成员变量**
	(5).最后是**派生类的成员变量**

对于空class A,大小为空,但是sizeof(A) = 1,因为其有一个占位符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值