我指的是这种讨论 。 我从来没有在C或C ++编写任何代码。 我没有任何背景的CS。 但是我一直在努力为Java开发人员为5年,现在我已经决定要了解更多关于CS和做一些追赶。
Answer 1:
当执行所给的一段代码,只要您拨打一个标准函数的执行时间超过倾销有载到该函数的代码略高。 倾销每次包含在功能全的代码是在另一端unmainteinable,因为它显然会导致重复代码的残局。
而不是有你的应用程序在运行时跳来跳去- -内联函数的代码在编译注入内联 ,让你声明该函数为内联 (至少在C ++),这样,当你调用该函数解决了性能和可维护性问题时间每一个给定函数被调用时。
这个不足之处是-如果你调用了很多次,你内嵌大功能-你的程序的大小可能会显著增加( 最佳做法建议做只小功能确实)。
Answer 2:
http://en.wikipedia.org/wiki/Inlining
在计算中,内联扩展,或内联,是一个编译器优化替换一个函数调用的位置与被调用者的身体。 这种优化可以提高的时间和空间的使用率在运行时,在增加了最终方案的规模可能涉及的费用。
Answer 3:
作为一个Java开发人员,您通常不必担心方法内联。 Java的刚刚在即时编译器能够而且将会自动在大多数地方,它是有道理的做到这一点。
像Eclipse集成开发环境可以有一个功能,可以让你在内嵌的源代码级别的方法- 从来没有做到这一点的表现,只为代码的可读性(例如,当你意识到刚才的方法调用一个另一种方法无需添加任何有用的本身)。
Answer 4:
在其他的答案已经提到的,内联是有代价。 这通常被认为是小的,但是当实际测量,你可能会感到惊讶,并了解它可能比你获得什么更大的(所以别人说什么是真实的:不优化,除非你已经测量)。
值得一提的是,在Linux内核中,他们最初联函数前段时间开始取消内联,因为成本太高(大功能消耗更多的CPU内存缓存,以及所产生的高速缓存未命中更昂贵不仅仅是调用函数这是意在被内联)。 请参阅“第15章:内联症”,在文档/文件/程序/编码-style.rst了解更多详情。
Answer 5:
诺曼·毛雷尔解释说,在他的博客一样,JVM和JIT内嵌功能
内联是一种技术,将基本上只是“内联”之一的另一种方法,因此摆脱方法调用的。 在JIT自动检测“热”的方法,并尝试内联它们。 如果被执行的多个X次,其中X是可以使用一个JVM标志时启动的Java(10000是默认值)被配置的阈值的方法,被认为是“热”。 这是需要为内联的所有方法会做更多的伤害,然后别的,因为巨大的生产字节码。 除了这个JIT可以“还原”前面的内嵌代码时的优化证明是错误的,在以后的状态。 记住JIT的时间代表就等优化(包括内联,还包括其他的东西),而执行代码。
也有警告
但即使考虑JVM的方法是“热”也不得内嵌了。 但为什么? 其中最可能的原因是,它实在是太大得到内联。
你可以找到内联在Java代码非常简单的代码示例伊娃Andreasson的的Java世界邮政 。 您可以在下面找到文章的相关部分。
许多优化,尽量消除机器级别的跳转指令(如JMP为x86体系结构)。 跳转指令改变指令指针寄存器,并由此传送执行流程。 这是相对于其它组件的指令是昂贵的操作,这就是为什么它是一个常见的目标,以减少或消除。 靶向这是一个非常有用的和众所周知的优化被称为内联。 因为跳跃是昂贵的,它可以帮助内联小很多方法调用频繁,具有不同的入口地址,到调用函数。 通过5 Java代码清单3例证内联的好处。
清单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;
}
Answer 6:
基本上,在C / C ++,编译器可以内联函数,这意味着,而不是使一个函数调用做该操作,该代码将被添加到调用函数的块,所以这将是,就好像它从未单独函数调用。
这将进入更详细: http://www.codersource.net/cpp_tutorial_inline_functions.html
Answer 7:
内联是指编译时优化,其中的代码的一个小功能将被注入到调用函数,而不是需要一个单独的呼叫。
Answer 8:
编译器优化的答案是正确的。 还有另一种使用情况,虽然-在重构 ,内联是指用该方法的主体替换方法调用,然后除去方法。 见联方法 。 有类似的重构,诸如内联类 。
编辑:请注意,重构是手工完成或用工具; 在任一情况下,它包括改变的源代码。
Answer 9:
内联函数通常用在C ++头文件不是Java。 A C ++头文件通常不包含实现的代码,被认为是具有相同名称的cpp文件,这并通常含有实现代码的接口。 它是合法的,包括在头文件中的内联函数,通常是小型轻量的功能。 内联函数做是有代价的,所以他们不应该是大的内存密集型操作。 对于小程序对性能的影响是最小的,他们用的比较多的便利。
Answer 10:
在讨论,乔恩斯基特提到客户端JVM(热点)V服务器JVM可用在运行时的性能改进,如果JIT(刚刚在时间)编译器允许将基于时间的增强功能。 这就是“它是如何做”在Java中。
原来,这不是从很多地方所谓的一小段代码将是“内联”由编译器,这意味着什么叫做单将直接在指令指针代码路径放置,做一个职能部门,并退回费用,更多的处理器不仅仅是展开循环或函数调用,并把指令“就在那里”
今天,辛格尔顿是多页的讨论和循环展开的主题,以及像内联从原来的上下文(S)稍微去除。 您可以就此事阅读多夫布尔卡的非常明智的工作,得到了C / C ++就此事项。 对于Java,它研究的丰富LIB的java.util中会比内联和深编译问题研究更好地满足您的需求 - 你可以得到挂在根深蒂固的四面楚歌校内战上的数据结构,这掩盖了电话到16位代码,并去你的学习曲线没有结束。
您可以在Java中的instanceof做,类似于一个VF-表(不加热的乡亲,请),但把它看作你在强类型语言在写 - 而现在的语言,其中字符串可以暴走轻松地闲逛在写它有没有生意。 我最近尝试编写构建Java中的图片代码,这样做,从C代码。 我很快就发现自己在看强加密OXR表 - 有没有关系我在写代码。
你会如何写有下32个字节和陷阱指针,以便他们只对字符串操作字符串一个小缓冲区C / C ++字符串类?
不是想逗你或任何东西,它只是一个开始,而不是内联和编译器的真正科学的好地方。