内联是由Java Just-In-Time编译器执行的优化。
如果你有一个方法:
public int addPlusOne(int a, int b) {
return a + b + 1;
}
,你这样调用:
public void testAddPlusOne() {
int v1 = addPlusOne(2, 5);
int v2 = addPlusOne(7, 13);
// do something with v1, v2
}
编译器可能会决定更换你的函数调用的函数体,这样的结果将实际看起来是这样的:
public void testAddPlusOne() {
int v1 = 2 + 5 + 1;
int v2 = 7 + 13 + 1
// do something with v1, v2
}
编译器会这样做以节省开销o f实际上正在进行函数调用,这将涉及将每个参数推送到堆栈。
这显然只能用于非虚拟功能。考虑如果方法在子类中被覆盖并且包含该方法的对象的类型在运行时才知道,会发生什么......编译器如何知道要复制的代码:基类的方法体或子类方法体?由于Java中默认所有方法都是虚拟的,因此可以明确标记那些不能被覆盖的方法(或将它们放入final
类中)。这将帮助编译器确定该方法永远不会被覆盖,并且内联是安全的。 (请注意,编译器有时也会对非最终方法做出此确定。)
另请注意,单词可能是的引用。最终的方法不保证是可以接受的。有多种方法可以保证方法不能被内联,但没有办法使编译器内联。无论如何,当内联有助于缓解代码的速度时,它几乎总是会比你更清楚。
请参阅wikipedia以获得有关优点和问题的良好概述。
这将是帮助:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html#vm – codaddict 2010-10-13 15:01:58