请选择 进入手机版 | 继续访问电脑版

C++对象模型和布局(三种经典类对象内存布局)

[复制链接]
奋斗在韩 发表于 2021-1-3 12:14:03 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
侯捷翻译的《深度探索C++对象模子》一书中,对C++对象模子举行了三种范例模子分别,分别为简朴对象模子(A Simple Object Model)、表格驱动对象模子(A Table-drive Object Model)、C++对象模子(The C++ Object、 Model)。本文以及之后的博客主要总结的都是最后一个C++对象模子。在C++中,成员分为成员变量和成员函数,此中成员变量分别静态成员变量(class static data members)、非静态成员变量(class nonstatic data members),成员函数分为静态成员函数(class static member function)、非静态成员函数(class nonstatic member function)、虚函数(class virtual member function)。
下面分别总结三种经典对象模子。
设计一个经典类Point如下,那么这个类的三种对象模子布局将在下面详细解说和分析。
  1. class Point{public:        Point(float x);        virtual ~Point();        float getX() const;        static int getCount();protected:        virtual ostream& print(ostream &os) const;private:        float x;        static int count;};
复制代码
一、简朴对象模子(A Simple Object Model)

1.1内存布局图


1.2原理形貌

C++简朴对象模子每一个object都由一系列的槽slot(本质是指针)组成,每一个slot指向一个成员member,member的布局按其声明顺序分列,如图一的内存模子所示。
1.3优缺点

优点:节流内存空间,每一个槽巨细固定,无论成员内存是多大,都只有一个指针巨细(在32位系统中一个指针巨细是4byte)。
缺点:执行效率低下,继承越多,效率急速下降。
二、表格驱动对象模子(A Table-drive Object Model)

2.1内存布局图


2.2原理形貌

C++表格驱动对象对简朴对象模子举行一层封装,只有两个slot(指针),分别指向成员变量表(Member Data Table)和成员函数表(Function Member Table)。此中,成员变量表直接存放该对象的数据成员,而成员函数表存放的是该对象所有函数的地点(或指针),如上面的图2所示。
2.3优缺点

优点:低落了对象的slot,也就是意味着提高了访问成员的效率,直接存取变量提高了效率和内存紧凑方便寻址。
缺点:成员变量一级寻址和成员函数二级寻址执行效率仍然很低,继承越多,效率下降越显着。
三、C++对象模子(The C++ Object、 Model)

3.1内存布局图


3.2原理形貌

C++对象模子从简朴对象模子派生,对简朴对象模子的内存和空间做了优化。此模子中,非静态成员变量(nonstatic data members)放置在class object内,而静态成员变量(static data members)则放置在object之外的静态数据区,静态成员函数(static function members)和非静态成员函数(nonstatic function members)同样也放置在class object之外的静态数据区平静凡函数区域,如上面的图3所示。虚函数(virtual function)则由一个虚函数表格表现,虚函数表由一个class object内的虚指针(vptr_Point)指引,该虚指针的值由类的构造函数、析构函数、拷贝构造函数自动完成。通常虚函数指针位于类对象的第一位。
3.3优缺点

优点:空间和存取时间效率高。
缺点:如果应用步伐代码自己未改变,但所用到的类对象的非静态数据成员有所修改(增加、移除、修改),那么那些应用步伐代码同样需要重新编译。
参考内容:
《深度探索C++对象模子》 侯捷 page:6-10

来源:https://blog.csdn.net/naibozhuan3744/article/details/112056282
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )