透析C++类对象的内存模型
虽然有许多人对C++类对象表示怀疑,但在年复一年的不断发展中,他的使用率也在不断提高。如过要想对C++类对象充分了解,但前提是要深入理解到底什么是C++类对象,及他是怎么运作的。
首先介绍一下C++中有继承关系的类对象内存的布局:在C++中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。
对于子类,最开始的内存数据记录着父类对象的拷贝(包括父类虚函数表指针和成员变量)。 之后是子类自己的成员变量数据。对于子类的子类,也是同样的原理。但是无论继承了多少个子类,对象中始终只有一个虚函数表指针。
为了探讨C++类对象的内存布局,先来写几个类和函数首先写一个基类:然后,我们多种不同的继承情况来研究子类的内存对象结构。
1. 无虚函数集继承
//子类1,无虚函数重载 class Child1 : public Base { public: virtual void f1() { cout << "Child1::f1" << endl; } virtual void g1() { cout << "Child1::g1" << endl; } virtual void h1() { cout << "Child1::h1" << endl; } int child1; protected: private: };
2. 有一个虚函数继承
//子类1,无虚函数重载 class Child1 : public Base { public: virtual void f1() { cout << "Child1::f1" << endl; } virtual void g1() { cout << "Child1::g1" << endl; } virtual void h1() { cout << "Child1::h1" << endl; } int child1; protected: private: };
虚拟继承的子类的内存结构,和普通继承完全不同。虚拟继承的子类,有单独的虚函数表, 另外也单独保存一份父类的虚函数表,两部分之间用一个四个字节的0x00000000来作为分界。
相关推荐
Greatemperor 2020-07-18
Wonder的学习 2020-06-08
卷卷萌 2020-04-20
真新镇的涅法雷姆 2020-04-10
Ericbig 2020-03-03
madewobadan 2020-01-13
duanlove技术路途 2019-12-28
georgeandgeorge 2019-10-31
ustcrding 2012-02-06
x青年欢乐多 2019-05-07
austindev 2017-09-27
bigcactus 2012-06-14
yinbaoshiguang 2019-07-01
刘小文 2016-11-16
SilentPaladin 2014-07-24
CherrylinORC 2013-04-10
jddlcg 2012-09-17
longxx 2012-04-18
zgwyfz 2016-08-07