当前位置: 首页 > 知识库问答 >
问题:

内联方法的好处是什么

黎承颜
2023-03-14

我最近看到我的朋友编写的一个 Util 类有很多内联方法。该类与图像有关,并且具有诸如

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

我问他为什么要使用内联。我知道编译器会更改

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

var img:Image = // Implementation of method here

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

现在需要这个吗?如果需要,应该在什么时候使用它们?

编辑

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

问题

用扩展的函数体替换调用站点可能会以几种方式恶化性能:

    < li >在代码大小比速度更重要的应用程序中,如许多嵌入式系统,内联通常是不利的,除非是非常小的函数,如简单的赋值函数方法。 < li >代码大小的增加可能会导致一小部分关键代码不再适合缓存,从而导致缓存缺失和速度下降。 < li >内联过程中添加的变量可能会消耗额外的寄存器,在寄存器压力已经很高的区域,这可能会强制溢出,从而导致额外的RAM访问。 < li >语言规范可能允许程序对过程的参数进行额外的假设,而这些假设在过程被内联后就不能再进行了。 < li >如果代码大小增加太多,可能会超出资源限制(如RAM大小),导致程序无法运行或导致系统颠簸。今天,除了非常激进的内联之外,这不太可能成为桌面或服务器计算机的问题,但是对于嵌入式系统来说,这仍然是一个问题。

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

优势:

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

共有1个答案

西门嘉石
2023-03-14

维基百科会告诉你比你需要的更多的信息。

 类似资料:
  • 问题内容: 我一直在试图理解真正的含义: 内联函数 在C ++中,是在类声明中定义的成员函数。(2)编译器用该函数的实际代码替换的函数调用。关键字inline可用于提示编译器对成员或非成员函数的主体执行内联扩展。 排队 在编译过程中用函数代码的副本替换函数调用。 例如,它写成类似: 当方法为最终方法时,可以内联。 此处:http : //www.roseindia.net/javatutorial

  • 问题内容: 当我看到网站入门代码和示例时,CSS始终位于单独的文件中,命名为“ main.css”,“ default.css”或“ Site.css”。但是,当我编写页面代码时,经常会想将CSS与DOM元素直接插入一行,例如在图像上设置“ float:right”。我感觉这是“不良编码”,因为在示例中很少这样做。 我知道,如果将样式应用于多个对象,则应遵循“不要重复自己”(DRY)并将其分配给每

  • 问题内容: 什么是最好的Java图像处理库/方法?[关闭]我同时使用JAI媒体API和ImageMagick吗? ImageMagick存在一些可伸缩性问题,基于JNI的JMagick也没有吸引力。与ImageMagick相比,JAI执行大小调整操作时的质量结果较差。 有谁知道过任何出色的开源或商业工具,它们都是本机Java并可以提供高质量的结果? 问题答案: 我知道这个问题已经很老了,但是随着新

  • 问题内容: 我指的是这种讨论。我从未用C或C++编写任何代码。我没有任何CS背景。但是,我从事Java开发人员已有5年了,现在我决定学习更多有关CS的知识,并进行一些后续工作。 问题答案: 在执行给定的代码段时,无论何时调用标准函数,执行时间都比将其中包含的代码转储到该函数中略高。每当在函数中包含的整个代码都无法维护时,就进行转储,因为这显然会导致整个代码重复。 内联 通过让您将函数声明为 内联(

  • 我刚刚开发了一个Android应用程序(MINSDKVersion23/TargetSDKVersion29),它可以连接到BluetoothLE设备以定期获取数据。 现在,在MainActivity(不是第一个活动)中,我执行以下注册BroadcastReciever的操作: 当设备连接/发现/datareCieved时执行的所有回调都在StatusActivity中,而不是在BleServic

  • 除了直接绑定到一个方法,也可以在内联 JavaScript 语句中调用方法: <div id="example-3"> <button v-on:click="say('hi')">Say hi</button> <button v-on:click="say('what')">Say what</button> </div> new Vue({ el: '#example-3'