设为首页 加入收藏

TOP

关于C++对象模型的深入理解(六)
2018-03-14 09:00:23 】 浏览:792
Tags:关于 对象 模型 深入 理解
每次的派生操作而变化,只可间接存取。各家编译器实现技术之间的差异就在于间接存取的方法不同。

8.一般而言,virtual base class最有效的一种运用方式是:一个没有任何data member的抽象class。

2002-7-14

3.5对象成员的效率

如果没有把优化开关打开,就很难猜测一个程序的效率表现,因为程序代码潜在性的受到某些与编译器有关的东西的影响。程序员如果关心效率,应该实际测试,不要光凭推论或常识判断或假设。优化操作并不一定总是能够有效运行。

2002-7-15

3.6指向Data Members的指针

指向data members的指针可用来详细调查class members的底层布局,可用来决定vptr是放在class的起始处还是尾端,还可用来决定class中access sections的次序。

取一个nonstatic data member的地址,将会得到它在class的offset;而取一个static data member的地址或者取一个绑定于真正class object身上的data member的地址,将会得到该member在内存中的真正地址。这也正是someType someClass::*和someTye *潜在的区别。

2002-7-16

Function语意学The Semantics of Function

C++支持三种类型的member functions:static、nonstatic和virtual,每一种类型的调用方式都不同。

4.1 Members的各种调用方式

1.C++的设计准则之一便是nonstatic member function至少必须和一般的nonmember function有着相同的效率。编译器内部会将member函数实体转换为对等的nonmember函数实体,其步骤为:

ü改写函数原型signature以安插一个额外的参数this到member function中,使得class object可以调用该函数。其中,this是const指针,若该函数为const,则反映在this上面的结果是this指向的data也为const;

ü将每一个对nonstatic data member的存取操作改为经由this指针来存取;

ü将member function重新写成一个外部函数,对函数名称进行mangling处理;

此后,每一个函数调用操作也都必须转换,用以提供相应的实参。

2.关于虚拟函数的内部转换步骤:若normalize是一个virtual member function,ptr->normalize();会被内部转化为(*ptr->vptr[t])(ptr);事实上,vptr名称也会被mangled,因为可能存在有多个vptrs;t是vitrual table slot的索引值,关联到normalize函数;第二个ptr表示this指针。

3.使用class scope operator明确调用一个vitual function,或经由一个class object调用一个vitual function其决议方式会和nontatic member function一样!故virtual function的一个inline函数实体可被扩展开来,因而提供极大的效率利益。

4.static member function的主要特征是没有this指针,这导致它不能直接存取其class中的nonstatic members,不能被声明为const、volatile或virtual,也不需要经由class object才能调用。static member function会被提出于class声明之外,并给予一个经过mangled的适当名称。如果取一个static member function的地址,得到的将是其在内存中的地址,其地址类型并不是一个指向class member function的指针,而是一个nonmember函数指针。static member function的一个意想不到的好处是可以成为一个callback函数,也可以成功地应用在thread函数身上。

2002-07-17

4.2 Virtual Member Functions虚拟成员函数

1.C++中,多态polymorphism表示以一个public base class指针或reference寻址出一个derived class object。识别一个class是否支持多态,唯一适当的方法试看它是否有任何virtual function。只要class拥有一个virtual function,它就需要一份额外的执行期型别判断信息。

2.一个class只会有一个virtual table,其中内含对应class object中所有的active virtual functions的函数实体的地址。这些active virtual functions包括:

ü一个class定义的函数实体。它会改写overriding一个可能存在的base class virtual function。

ü继承自base class的函数实体。此时该class不改写base class virtual function。

ü一个pure_virtual_called()函数实体,它既可以扮演pure virtual function的空间保卫者,也可以当作执行期异常处理函数。如果该函数被调用,通常的操作是结束程序。

3.每一个virtual function都被指派一个固定不变的索引值,该值在整个继承体系中保持与特定virtual function的关联。这样就可以在编译时期设定virtual function的调用。

2002-7-20

4.多重继承下,一个上层basse classes数目为n的derived class,它将内含n-1个额外的virtual tables。其主要实体与最左端的base class共享,其中包含所有virtual functios的地址;n-1个次要实体与其它base classes有关,其中只包含出现在对应base class中virtual functions的地址。

5.在多重继承中支持virtual function,其复杂度围绕在第二个及后继base class上,以及执行期this指针调整上。第二(或后继)base class会影响对virtual function支持的3种情况:

ü通过指向第二个base class的指针,调用derived class virtual function;

ü通过指向derived class的指针,调用第二个base class中一个继承而来的virtual function;

ü允许virtual function函数的返回值类型有所变化,可能是base type,也可能是publicly derived type。

6.关于执行期this指针调整比较有效率的解决方法是thunk。所谓thunk是一小端assembly码,用来以适当的offset值来调整this指针并跳到相应的virtual function。thunk技术允许virtual table slot继续内含一

首页 上一页 3 4 5 6 7 下一页 尾页 6/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇万能的C++头文件分享 下一篇C++设计模式之原型模式(克隆羊多..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目