我指的是 这次讨论.我从未写入任何码在C或者在C++。我没有任何CS背景。但是我一直作为Java开发5年,现在我已经决定要了解更多关于CS,并做一些赶上来。

有帮助吗?

解决方案

当执行给定的一段代码,每当调用一个标准的函数执行时间比倾倒有包含到该函数的代码略高。倾销每次包含在功能全的代码是在另一端unmainteinable,因为它显然会导致重复代码的残局。

内联通过让解决了性能和可维护性问题声明的功能的内联(至少在C ++),以使得当调用该函数 - 来代替具有您的应用程序在运行时跳来跳去 - 内联函数的代码在编译时每一个给定函数被调用时注入

这个不足之处是 - 如果你内嵌大功能,你调用了很多次了 - 你的程序的大小可能会显著增加(最佳实践的建议做只小功能确实)

其他提示

http://en.wikipedia.org/wiki/Inlining

在计算中,内联展开,或内联,是一个编译器优化替换一个函数调用的位置与所述被叫用户的身体。这种优化可以改善时间和空间使用在运行时,在增加了最终程序的大小的可能成本。

作为一个Java开发人员,您通常不必担心方法内联。 Java的刚刚在即时编译器能够而且将会自动在大多数地方,它是有道理的做到这一点。

像Eclipse集成开发环境可以有一个功能,可以让你内嵌在源代码级的方法 - 的从不的性能,当你意识到,该方法只是调用一个做到这一点,只为代码的可读性(如不添加任何有用本身)其他方法。

诺曼*莫伊雷尔 解释了他 博客 JVM和JIT内联等功能,

内联是一种技术,这将基本上只是"内联"一个方法在另一,并因此摆脱的方法调用。 JIT自动检测到"热点"的方法,并尝试联它们。 一种方法是视为"热"如果这是执行更多的X倍,其中X是一个阈值,可以构成为使用JVM标志的时候开始java(10000是默认)。这是必要的,因为内联的所有方法都会做更大的伤害,然后任何东西,因为巨大的产生字节的代码。除了这JIT可能"恢复"之前的内联的代码时,优化实证明是错误的,在以后的状态。记得JIT代表只是在时间和所以优化(其中包括内联,但也有其他的东西),同时执行你的代码。

还有一个警告

但是,即使JVM考虑的一个方法是"热点"它不可能的内联。但为什么?一个最可能的原因是,它是 只是大获得内联。

你可以找到一个非常简单的代码如对内联Java代码 Eva Andreasson's Java世界后.你可以找到相关部分的员额如下。

许多优化试图消除机器级妄的指令(例如,JMP x86架构).一个跳的指示变化的指令的指令寄存器,从而转移的执行流动。这是一个昂贵的运作相对于其他会指令,这就是为什么它是一个共同的目标,以减少或消除。 一个非常有用的和众所周知的最优化这一目标,这称为内联。 由于跳跃是昂贵的,它可以帮助许多内联频繁的呼吁小的方法,具有不同的入口的地址,到调功能。Java码清单3至5表明的好处内联。

清单3.叫法

int whenToEvaluateZing(int y) {
   return daysLeft(y) + daysLeft(0) + daysLeft(y+1);
}

清单4.叫法

int daysLeft(int x){
   if (x == 0)
      return 0;
   else
      return x - 1;
}

清单5.内联的方法

int whenToEvaluateZing(int y){
   int temp = 0;

   if(y == 0) temp += 0; else temp += y - 1;
   if(0 == 0) temp += 0; else temp += 0 - 1;
   if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;

   return temp; 
}

在列表3至5调方法,使得三个呼叫 小的方法,这是我们承担这个例子的缘故是更多 有利于内联比跳跃到三倍。

它可能不会有太大的差别,以内联的一个方法,该方法被称为 很少,但内联所谓的"热点"方法,该方法是经常 所谓可能意味着巨大的差别性能。内联还 经常使得方式作进一步的优化,以显示清单6。

清单6.之后的内联,更优化可以应用

int whenToEvaluateZing(int y){
   if(y == 0) return y;
   else if (y == -1) return y - 1;
   else return y + y - 1;
}

正如在其他的答案已经提到的,内联配有成本。这通常被认为是小的,但是当实际测量,你可能会感到惊讶,并了解它可能比你收获了什么(所以的其他人说什么是真的:不优化,除非你已经测量)

值得注意的是,在Linux内核中,他们最初联函数前段时间开始取消内联,因为成本太高(大功能消耗更多的CPU内存缓存,以及所产生的高速缓存未命中比刚才更贵打电话的用意,该函数被内联)。请参阅“第15章:内联症”,在文档/文件/程序/编码-style.rst 获得更多的细节。

基本上,在C / C ++,编译器可以内联函数,这意味着,而不是使一个函数调用做该操作,该代码将被添加到调用函数的块,所以这将是,就好像它从未一直是一个单独的函数调用。

此将进入更详细: http://www.codersource.net/cpp_tutorial_inline_functions.html

内联是指编译时优化,其中的代码的一个小功能将被注入到调用函数,而不是需要一个单独的呼叫。

在编译器优化的答案是否正确。还有另一种用法,虽然 - 在重构,内联是指用身体替换方法调用该方法的,然后除去方法。请参见联方法。有类似的重构,例如内嵌类

编辑:请注意,重构是手动完成或用工具;在任一情况下,它包括改变的源代码。

内联函数通常用在C ++头文件不是Java。 A C ++头文件通常不包含实现的代码,被认为是具有相同名称的cpp文件,这并通常含有实现代码的接口。它是合法的,包括在头文件中的内联函数,通常是小型轻量的功能。内联函数做是有代价的,所以他们不应该是大的内存密集型操作。对于小程序对性能的影响是最小的,他们用的比较多的便利。

在那次讨论,乔恩斯基特提到客户端JVM(热点)V服务器JVM可用在运行时的性能改进,如果JIT(刚刚在时间)编译器允许将基于时间的增强功能。这就是“它是如何做”在Java中。

最初的一小段代码是否是从许多地方将“内联”由编译器调用,这意味着什么叫做单将直接在指令指针代码路径放置,做一个职能部门,并返回成本多个处理器功率不仅仅是展开到循环或函数调用和放置的指示“右有”

今天,单例是多页的讨论和循环展开的主题以及类似的内联从其原始上下文(多个)被稍微除去。您可以就此事阅读多夫布尔卡的非常明智的工作,得到了C / C ++就此事项。对于Java,它研究的丰富LIB的java.util中会比内联和深编译问题研究更好地满足您的需求 - 你可以得到挂在根深蒂固的四面楚歌校内战上的数据结构,这掩盖了电话到16位代码,并去你的学习曲线没有结束。

您可以在Java中的instanceof做,类似于一个VF-表(不加热的乡亲,请),但把它看作你在强类型语言在写 - 而现在的语言来写,其中字符串可以暴走围绕它有没有企业轻松戳。我最近尝试编写构建Java中的图片代码,这样做,从C代码。我很快就发现自己在看强加密OXR表 - 有没有关系我在写代码。

你如何写在具有用于下32个字节和陷阱的指针串,以便它们仅在字符串操作一个小缓冲区C / C ++的字符串类?

不是想逗你或任何东西,它只是一个非常良好的开端,而不是内联和编译器的科学。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top