C++标准编程:虚函数与内联
来源:优易学  2010-1-15 9:26:51   【优易学:中国教育考试门户网】   资料下载   IT书店

 

  这个print实例是内联的吗?不,当然不是。这样不得不通过虚拟机制在运行期决议。这让print实例放弃了对它的内联声明了吗?也不是。这个调用转换为下面的形式(伪代码):

  // Pseudo C++ Code

  // Possible transformation of p->print()

  ( *p->_vptr[ 2 ] )( p );

  where 2 represents the location of print within the associated virtual function table.因为调用print是通过函数指针_vptr[2]进行的,所以,编译器不能静态的决定这个调用地址,并且,这个函数也不能内联。

  当然,虚函数print的内联实体(definition)也必须在某个地方表现出来。 即是说,至少有一个函数实体是在virtual table调用的地址原地展开的。编译器是如何决定在何时展开这个函数实体呢?其中一个编译(implementaion)策略是当virtual table生成的同时,生成这个函数实体。这就是说对于每一个派生类的virtual table都会生成一个函数实体。

  在一个可应用的类[b]中有多少vitrual table会被生成呢?呵呵,这是一个好问题。C++标准中对虚函数行为进行了规定,但是没有对函数实现进行规定。由于virtual table没有在C++标准中进行规定,很明显,究竟这个virtual table怎样生成,和究竟要生成多少个vitrual table也没有规定。多少个?当然,我们只要一个。Stroustrup的cfront编译器,很巧妙的处理了这些情况.( Stan and Andy Koenig described the algorithm 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。新的规则要求编译器只展开一个内联虚函数。如果一点被广泛采用的话,虚函数的内联导致的代码膨胀问题就会消失。

  [译注: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》)

  [b]一个产品类(?)

  总结:

  就是虚函数inline在调用链等地方很有用~

  即使没有加入inline声明,作为一个好编译器,都会优化(虚析构函数)

  在很长的函数调用链中,最好将链中基类的函数inline,这样节约开销

  至于在什么地方inline,由编译器决定,因为C++标准没有规定

  新C++标准(可能没有通过)中,规定了,inline化只对产品类有效,且只动作一次

  保证代码不过度膨胀

  inline动作是在产品类实例化同时,和vtable生成一起。

上一页  [1] [2] [3] 

责任编辑:cyth

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训