java中是否有内联函数?

gir*_*iri 105 java inline-code

在java中是否有内联函数的概念,或者它取代了其他东西?如果有,它是如何使用的?我听说public,staticfinal方法是内联函数.我们可以创建自己的内联函数吗?

not*_*oop 117

在Java中,优化通常在JVM级别完成.在运行时,JVM执行一些"复杂"分析以确定要内联的方法.它可以在内联方面具有攻击性,而Hotspot JVM实际上可以内联非最终方法.

java编译器几乎从不内联任何方法调用(JVM在运行时完成所有这些操作).它们执行内联编译时间常量(例如,最终静态原始值).但不是方法.

有关更多资源:

  1. 文章:Java HotSpot性能引擎:方法内联示例

  2. Wiki:在OpenJDK中内联,没有完全填充,但包含有用讨论的链接.


Tho*_*ens 14

Java没有提供手动建议应该内联方法的方法.正如@notnoop在评论中所说,内联通常由JVM在执行时完成.

  • 大多数java编译器从不内联方法调用.大多数情况下,JVM都是这样做的. (3认同)

Arn*_*ter 14

不,java中没有内联函数.是的,当放置在公共类中时,您可以在代码中的任何位置使用公共静态方法.java编译器可以在静态或最终方法上进行内联扩展,但这不能保证.

通常,这样的代码优化由编译器结合JVM/JIT/HotSpot来完成,以便经常使用代码段.在java中也不知道其他优化概念,如参数的寄存器声明.

优化不能通过java中的声明来强制,而是由编译器和JIT完成.在许多其他语言中,这些声明通常只是编译器提示(您可以声明比处理器更多的寄存器参数,其余部分被忽略).

声明java方法static,final或private也是编译器的提示.你应该使用它,但没有保证.Java性能是动态的,而不是静态的.由于类加载,对系统的第一次调用总是很慢.下一次调用更快,但根据内存和运行时,最常见的调用在运行系统中进行了优化,因此服务器在运行时可能会变得更快!

  • `final`对JIT内联没有影响 (3认同)

Gre*_*nie 5

你上面说的都是对的。有时,final 方法被创建为内联函数,但在 java 中没有其他方法可以显式创建内联函数。

  • @Thomas - 这就是为什么我说“有时最终方法......” (6认同)
  • 最终方法不保证是内联的。 (5认同)
  • 在 HotSpot 上,添加“final”对于方法是否内联没有任何影响。 (4认同)