内联方法的好处是什么?

时间:2013-05-21 06:34:31

标签: inline concept conceptual

我最近看到一个Util课程由我的朋友编写,有很多inline方法。该课程非常关注图像,并且具有类似

的方法
public static inline function resize ( img:Image, width:Int, height:Int)
{
    //... method implementation goes here.
}

我问他为什么使用inline。我知道编译器会改变

var img:Image = ImgUtil.resize(img, 100, 100);

var img:Image = // Implementation of method here

他只是说它减少了对函数的调用,并且只在实用程序方法上使用它们。每次增加程序大小时不会复制相同的代码吗?

现在需要吗?如果需要,何时应该使用它们?

修改

我列出了Patrick提供的链接中列出的大多数问题和优势,以帮助那些不想浏览链接的未来观众。

问题

使用扩展的功能体替换呼叫站点可能会以多种方式恶化性能:

  • 在代码大小比速度更重要的应用程序中,例如许多嵌入式系统,内联通常是不利的,除了非常小的函数,例如普通的mutator方法。
  • 代码大小的增加可能会导致一小段关键代码不再适合缓存,从而导致缓存未命中和速度减慢。
  • 内联过程中添加的变量可能会占用额外的寄存器,并且在寄存器压力已经很高的区域中,这可能会导致溢出,从而导致额外的RAM访问。
  • 语言规范可能允许程序对内联过程后无法再进行的过程参数做出额外的假设。
  • 如果代码大小增加太多,可能会超出RAM大小等资源限制,导致程序无法运行或导致颠簸。今天,除了非常积极的内联之外,这不太可能是台式机或服务器计算机的问题,但它仍然是嵌入式系统的一个问题。

通常情况下,编译器开发人员会牢记这些问题,并将启发式算法纳入其编译器中,这些编译器选择内联函数以提高性能,而不是在大多数情况下使其恶化。

优点:

内联扩展本身就是一种优化,因为它消除了调用的开销,但它作为一种启用转换更为重要。也就是说,一旦编译器在其调用站点的上下文中扩展了一个函数体 - 通常使用可能是固定常量的参数 - 它可能能够进行以前不可能的各种转换。例如,条件分支可能在此特定呼叫站点处始终为真或始终为假。这反过来可以实现死代码消除,循环不变代码运动或归纳变量消除。

1 个答案:

答案 0 :(得分:0)

Wikipedia会告诉你比你更需要的东西。