深度探索c++对象模型笔记

深度探索c++对象模型笔记

ID:12996762

大小:48.50 KB

页数:4页

时间:2018-07-20

深度探索c++对象模型笔记_第1页
深度探索c++对象模型笔记_第2页
深度探索c++对象模型笔记_第3页
深度探索c++对象模型笔记_第4页
资源描述:

《深度探索c++对象模型笔记》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、第一章在C++中有两种classdatamembers:static和nnstatic.u三种classmemberfunctions:static、nonstatic和virtual。u表格驱动对象模型(ATable-drivenObjectModel):²把所有与members相关的住处抽出来,放在一个datamembertable和一个memberfunctiontable之中,classobject本身则内含指向这两个表格的指针:memberfunctiontable是一系列的slots,每一个slot指出

2、一个memberfunction;datamemberable则直接含有data本身。uC++对象模型(TheC++ObjectModel)²Nonstaticdatamember被置于每一个classobject之内,staticdatamember则被存放在所有classobject之外,static和nonstaticfunctionmember也被放在所有的classobject之外。Virtualfunction则以两个步骤支持:产生一个virtualtable(vtbl)表中是一个个的函数指针,指向vi

3、rtualfunction;每个classobject被添加一个指针,指向相关的virtualtable(vptr)。Vptr的设定和重置都由每一个的class的constructor、destructor和copyassignment运算符自动完成。u需要多少内存才能表现一个classobject?nonstaticdatamember的总和大小;任何由于alignment(译注)的需求而填补(padding)上去的空间;为了支持virtual而由内部产生的任何额外负担(overhead);u一个OB(objec

4、tbase)设计可能比一个对等的OO(objectoriented)设计速度更快而且空间更紧凑,速度快是因为所有的函数引发操作都在编译时期解析完成,对象建构起来不需要设置virtual机制;空间紧凑则是因为每一个classobject不需要负担传统上为了支持virtual机制而需要的额外负荷,不过OB设计比较没有弹性。u一个指针或者引用之所以支持多态,是因为他们并不引发内存中任何“与类型有关的内存委托操作”受到影响的只是“目标内存的大小和内容“的解释方式。而基类对象被初始化为子类对象,其子类对象的信息就会被slic

5、e,以塞入较小的基类内存中,而派生类型没有在基类对象中留下任何的信息,包括vptr。uC++程序支持3种编程模型:过程model,像c一样;抽象数据类型模型(ADT),只有封装,没有继承和多态;面向对旬模型(OO),典型的支持继承、封装和多态。uC++中支持金矿的方法:子类对象基类指针、引用;虚函数;dynamic_cast或者typeid运算符。第二章(thesemanticsofconstructors)uDefaultconstructors在需要时被编译器产生出来(注:差别在于一个是程序的需要,一个是编译器

6、的需要)。uCopyconstructor(如果是默认的拷贝并不会拷贝memberclassobject)赋值时;传参时;返回时;u把一个classobject当做参数传给一个函数,相当于以下形式初始化操作:xxx=xxx;u例返回转换:Xbar(){Xxx;Returnxx;}//可能转换为下列形式:Voidbar(x&_result){Xxx;xx.x::xx();//defaultconstructor_result.x::xx(xx);//copyconstructorReturn;}现在编译器必须转换每一

7、个bar()调用操作,以反映其新定义。如:Xxx=bar();将被转换为下列两个指令句:Xxx;Bar(xx);而bar().memfunc()可能被转化为:X_temp0;(bar(_temp0),_temp0).memfunc();同样道理,如果程序声明了一个函数指针,像这样:X(*pf)();Pf=bar;它也必须被转化为:Void(*pf)(x&);Pf=bar;第三章(Thesemanticsofdaa)uStaticdatamembers存放在程序的datasegment中和个别的classobject

8、无关。u相邻member之间未必连续。u类中处于同一个accesssection中的数据,必定保证以其声明次序出现在内存布局中。但是不同的accesssection中的各个数据,其排列次序则没有规定。uMember的位置在编译时就固定了,因此存取members只是一个简单的offset运算。u取一个nonstaticdatamember的地址,将会得到它在c

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。