理解inline化的介入和排除 (1)

2008-02-23 05:28:36来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

inline 函数——多么棒的主意啊!他们看起来像函数,他们产生的效果也像函数,他们在各方面都比宏好得太多太多,而您却能够在调用他们时不招致函数调用的成本。您更有什么更多的需要呢?

  实际上您得到的可能比您想的更多,因为避免函数调用的成本只是故事的一部分。在典型情况下,编译器的优化是为了一段连续的没有函数调用的代码设计的,所以当您 inline 化一个函数,您可能就使得编译器能够对函数体实行上下文相关的特别优化。大多数编译器都不会对 "outlined" 函数调用实行这样的优化。

  然而,在编程中,就像在生活中,没有免费午餐,而 inline 函数也不例外。一个 inline 函数背后的思想是用函数本体代替每一处对这个函数的调用,而且不必拿着统计表中的 Ph.D. 就能够看出这样可能会增加您的目标代码的大小。在有限内存的机器上,过分热衷于 inline 化会使得程式对于可用空间来说过于庞大。即使使用了虚拟内存,inline 引起的代码膨胀也会导致附加的分页调度,减少指令缓存命中率,连同随之而来的性能损失。

  在另一方面,假如一个 inline 函数本体很短,为函数本体生成的代码可能比为一个函数调用生成的代码还要小。假如是这种情况,inline 化这个函数能够实际上导致更小的目标代码和更高的指令缓存命中率! 记住,inline 是向编译器发出的一个请求,而不是个命令。这个请求能够以显式的或隐式的方式提出。隐式的方法就是在一个类定义的内部定义一个函数:

class Person {
 public:
  ...
  int age() const { return theAge; } // an implicit inline request: age is
  ... // defined in a class definition

 private:
  int theAge;
};

  这样的函数通常是成员函数,但是我们知道友元函数也能被定义在类的内部,假如他们在那里,他们也被隐式地声明为 inline。

  显式的声明一个 inline 函数的方法是在他的声明之前加上 inline 关键字。例如,以下就是标准 max 模板(来自 )经常用到的的实现方法:

template // an explicit inline
inline const T& std::max(const T& a, const T& b) // request: std::max is
{ return a < b ? b : a; } // preceded by "inline"




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 理解inline化的介入和排除 (2)

下一篇: C 类对象的深拷贝、浅拷贝构造函数 (2)

热门词条
热门标签