C++标准编程:虚函数与内联_第1页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c+标准编程:虚函数与内联曾经在研究c+的时候,常常会问到:“虚函数能被声明为内联吗?”现在,我们几乎听不到这个问题了。现在听到的是:“你不应当使print成为内联的。声明一个虚函数为内联是错误的!”这种说法的两个主要的缘由是(1)虚函数是在运行期决议而内联是一个编译期动作,所以,我们将虚函数声明为内联并得不到什么效果;(2)声明一个虚函数为内联导致了函数的多分拷贝,而且我们为一个不应当在任何时候内联的函数白白花费了存储空间。这样做很没脑子。不过,事实并不是这样。我们先来看看第一个:许多状况下,虚拟函数都被静态地决议了比如在派生类虚拟函数中调用基类的虚拟函数的时候。为什么这样做呢?封装。一个比

2、较显然的例子就是派生类析构函数调用链。全部的虚析构函数,除了最初触发这个析构链的虚析构函数,都被静态的决议了。假如不将基类的虚析构函数内联,我们无法从中获利a。这和不内联一个虚拟析构函数有什么不同吗?假如继承体系层次比较深并且有许多这样的类的实例要被销毁的话,答案是绝对的。再来看另外一个不用析构函数的例子,想象一下设计一个图书馆类。我们将materiallocation作为抽象类librarymaterial的一个成员。将它的print成员函数声明为一个纯虚函数,并且提供函数定义:它输出materiallocation。class librarymaterial private:materia

3、llocation _loc; / shared data/ .public:/ declares pure virtual functioninline virtual void print( ostream& = cout ) = 0;/ we actually want to encapsulate the handling of the/ location of the material within a base class/ librarymaterial print() method - we just dont want it/ invoked through the

4、virtual interface. that is, it is/ only to be invoked within a derived class print() methodinline voidlibrarymaterial:print( ostream &os ) os print();这个print实例是内联的吗?不,固然不是。这样不得不通过虚拟机制在运行期决议。这让print实例放弃了对它的内联声明白吗?也不是。这个调用转换为下面的形式(伪代码):/ pseudo code/ possible transformation of p->print()( *p-&g

5、t;_vptr 2 )( p );where 2 represents the location of print within the associated virtual function table.由于调用print是通过函数指针_vptr2举行的,所以,编译器不能静态的打算这个调用地址,并且,这个函数也不能内联。固然,虚函数print的内联实体(definition)也必需在某个地方表现出来。 即是说,起码有一个函数实体是在virtual table调用的地址原地绽开的。编译器是如何打算在何时绽开这个函数实体呢?其中一个编译(implementaion)策略是当virtual tab

6、le生成的同时,生成这个函数实体。这就是说对于每一个派生类的virtual table都会生成一个函数实体。在一个可应用的类中有多少vitrual table会被生成呢?呵呵,这是一个好问题。c+标准中对虚函数行为举行了规定,但是没有对函数实现举行规定。因为virtual table没有在c+标准中举行规定,很显然,毕竟这个virtual table怎样生成,和毕竟要生成多少个vitrual table也没有规定。多少个?固然,我们只要一个。stroustrup的cfront编译器,很巧妙的处理了这些状况.( stan and andy koenig described the algorit

7、hm in the march 1990 c+ report article, "optimizing virtual tables in c+ release 2.0.")moreover, the c+ standard now requires that inline functions behave as though only one definition for an inline function exists in the program even though the function may be defined in different files。新

8、的规章要求编译器只绽开一个内联虚函数。假如一点被广泛采纳的话,虚函数的内联导致的代码膨胀问题就会消逝。译注:c+ standard: 9.3.8, member function of local class shall be defined inline in their class defination, if they are defined at all=译注:a函数调用开销,调用基类虚函数的时候起码要经过两次间接过程(s. b.lippman: inside the c+ object model)一个产品类(?)总结:就是虚函数inline在调用链等地方很实用即使没有加入inline声明,作为一个好编译器,都会优化(虚析构函数)在很长的函数调用链中,最好将链中基类的函数inline

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论