我最近看到一个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提供的链接中列出的大多数问题和优势,以帮助那些不想浏览链接的未来观众。
问题
使用扩展的功能体替换呼叫站点可能会以多种方式恶化性能:
通常情况下,编译器开发人员会牢记这些问题,并将启发式算法纳入其编译器中,这些编译器选择内联函数以提高性能,而不是在大多数情况下使其恶化。
优点:
内联扩展本身就是一种优化,因为它消除了调用的开销,但它作为一种启用转换更为重要。也就是说,一旦编译器在其调用站点的上下文中扩展了一个函数体 - 通常使用可能是固定常量的参数 - 它可能能够进行以前不可能的各种转换。例如,条件分支可能在此特定呼叫站点处始终为真或始终为假。这反过来可以实现死代码消除,循环不变代码运动或归纳变量消除。