欢迎来到天天文库
浏览记录
ID:30376087
大小:86.64 KB
页数:13页
时间:2018-12-29
《《深度探索c对象模型》读书笔记二》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、《深度探索C对象模型》读书笔记二2002-7-63.3DataMember的存取1.不管什么情况,每一个staticdatamember只有一个实体,放在程序的datasegment之中,每次程序取用staticmember,不管是通过operator:还是memberselectionoperator,都会被内部转化为对该唯一extern实体的直接参考操作。每一个staticmember的存取以及与class的关联不会导致任何执行时间或空间上的额外负担。如果有两个classes,每一个都声明了一个staticmemberfreeList,那么当它们都放在程序的
2、datasegment时,就会导致名称冲突,编译器的解决方法是使用name-mangling,暗中对每一个staticdatamember编码,以获得一个独一无二的程序识别代码。2.有多少个编译器,就有多少种name-mangling做法,任何name-mangling做法都有两个要点:ü一种算法,推导出独一无二的名称;ü如果编译系统或者环境工具必须和使用者交谈,那些独一无二的名称可被轻易推导回原先的名称。3.取一个staticdatamember的地址,会得到一个指向其数据类型的常量指针,而不是指向其classmember的指针。4.nonstaticdata
3、members直接放在每一个classobject之中,除非经过显示的explicit或隐含的implicitclassobject,没有办法直接存取它们。只要程序员在一个memberfunction中直接处理一个nonstaticdatamember,所谓implicitclassobject就会发生,其实质是编译器会为这个memberfunction增添一个constthis指针,而在函数体内通过这个this指针来存取nontaticdatamember。5.欲对一个nonstaticdatamember进行存取操作,编译器需要把classobject的起始
4、地址加上datamember的编译量offset,如地址&someObject.someMember等于&someobject+(&theClass:someMember–1);指向datamember的指针,其offset值总是会被加上1,这样可以使编译系统区分出一个指向class第一个datamember的指针和一个没有指向任何datamember的指针。6.每一个nonstaticdatamember的偏移量在编译时期即可获知,甚至如果member属于一个单一或多重继承体系中baseclasssubobject也是一样,因此其存取效率和一个Cstructm
5、ember或一个nonderivedclass的member的存取效率是一样的。但是在虚拟继承的情况下就另当别论了:如果该nonstaticdatamember是一个virtualbaseclass的member,并且通过指针来存取的话,在编译时期就不会得知这个member真正的offset位置,所以这个存取操作必须延迟至执行期,经由一个额外的间接导引才能够解决。2002-7-73.4"继承"与DataMember1.在C++继承模型中,一个derivedclassobject所表现出来的东西,是其自己的members加上其baseclassesmembers的
6、总和。C++并未规定derivedclassmembers和baseclassesmembers的排列次序。不过,在大部分编译器上,除virtualbaseclass外,baseclassmembers总是先出现。2.一般而言,具体继承concreteinheritance并不会增加空间或存取时间上的额外负担。3.把两个原本独立不相干的classes凑成一对type/subtype,并带有继承关系容易犯两个错误。一是可能会重复设计一些相同操作的函数,一般而言,选择某些函数做成inline函数,是设计class的一个重要课题;二是把一个class分解为多层,有可能
7、会为了表现class体系之抽象化,因为编译器的边界调整而膨胀所需空间。其根本原因是C++保证出现在derivedclass中的baseclasssubobject有其完整原样性。4.C++最初问世时,许多编译器把vptr放在classobject的尾端,这样可以保留baseclassCstruct的对象布局。此后,某些编译器开始把vptr放在classobject的开始处,这样会给多重继承下通过指向classmembers之指针调用virtualfunction带来一些帮助,否则,在执行期不仅必须备妥从classobject起点处开始量起的offset,而且必须
8、备妥classvptr之
此文档下载收益归作者所有