C++创建的类在内存的存储分布

        用C++语言创建一个类对象模型时,基本上包含成员变量(数据)和成员方法(函数)两种类型,这时C++编译器就要考虑如何对这个类的两部分分别在内存如何划分不同的区域进行存储。

参考深度探索C++对象模型中的一个类的例子:

/*定义一个点类,用于讲解C++对象模型*/
class Point
{
	public:
		Point(float xval);
		virtual ~Point();
		
		float x() const;
		static int PointCount();
	
	protected:
		virtual ostream& print(ostream& os)const;
		float _x;
		static int _point_count;
};

一般我们容易想到类的存储对象的模型如下图所示:

 

                       

                                                                          模型一

此种模型的优点是模型简单、易于实现、效率高,但是缺点也是致命的那就是极度浪费内存空间不利于后期优化。

因此当初stroustrup对内存空间和存取时间做了优化,在设计模型中,Nonstatic data menbers被配置与每一个class object之内,static data members则被存放在个别的class object之外,static和Nonstatic function members也被放在个别的class object之外,virtual functions则以两个步骤支持之:

1.每一个class产生出一堆指向virtual functions 的指针,放在表格之中。这个表格被称为virtual table(vtbl)。

2.每一个class object被安插一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设定和重置都由每一个class的constructor、destructor和copy assignment运算符自动完成。每一个class所关联的type_info object也经由virtual table被指出来,通常放在表格的第一个slot。

另外,C++编译器一般的内存分区为:全局数据区、代码区、栈区、堆区。其中全局数据区一般包括全局变量、静态数据、常量;代码区一般包括程序文件的代码段包括成员函数(静态成员函数、非静态成员函数)、非成员函数;栈区一般包括局部变量、函数参数、函数返回值等;堆区一般包括new关键字、malloc函数等。

                                                              

                                                                                    内存存储分区

 

因此,参照C++对象模型以及内存存储分区的知识我们可以把Point类的内存存储模型描述为如下所示:

                                                              

展开阅读全文

没有更多推荐了,返回首页