Java之内联函数_内联函数的优缺点

编程语言及工具

105人已加入

描述

  内联函数

  1.内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。

  2.Java语言中有一个关键字final来指明那个函数是内联的,例:

  public final void doSomething() {

  // to do something

  }

  该方法在被调用时,会在调用处直接展开使用,从而提高程序执行速度。此外final关键字还有一个作用,防止doSomething方法在子类中被覆盖,如果你希望doSomething是一个最终行为的话,那它应该被设计成final。

  内联不一定好,当被指定为内联的方法体很大时,展开的开销可能就已经超过了普通函数调用调用的时间,引入了内联反而降低了性能,因为在选择这个关键字应该慎重些,不过,在以后高版本的JVM中,在处理内联时做出了优化,它会根据方法的规模来确定是否展开调用。

  

  Java实现内联函数

  C++是否为内联函数由自己决定,Java由编译器决定。

  Java不支持直接声明为内联函数的,如果想让他内联,则是由编译器说了算,你只能够向编译器提出请求。

  final除了不能被override外,还可能实现内联。

  如果函数为private,则也可能是内联的。

  总的来说,一般的函数都不会被当做内联函数,只有声明了final后,编译器才会考虑是不是要把你的函数变成内联函数。

  内联函数的优缺点

  Inline这个名称就可以反映出它的工作方式,函数会在它所调用的位置上展开。这么做可以消除函数调用和返回所带来的开销(寄存器存储和恢复),而且,由于编译器会把调用函数的代码和函数本身放在一起优化,所以也有进一步优化代码的可能。不过这么做是有代价的,代码会变长,这就意味着占用更多的内存空间或者占用更多的指令缓存。内核开发者通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数。如果你把一个大块头的程序做成了内联函数,却不需要争分夺秒,反而反复调用它,这么做就失去了内联的意义了。

  总结:对于简短的函数并且调用次数比较多的情况,适合使用内联函数。

  使用方法:定义一个内联函数的时候,需要使用static作为关键字,并且用inline限定它(没试过,暂且留在这里)。比如:

  static inline void dog(unsigned long tail_size);

  内联函数必须在使用前就定义好,否则编译器就没法把这个函数展开。实践中一般在头文件中定义内联函数。由于使用了static作为关键字进行限制,所以在编译时不会为内联函数单独建一个函数体(这里不太明白)。如果一个内联函数仅仅在某个源文件中使用,那么也可以把它定义在该文件开始的地方。

  注意:在内核中,为了类型安全的原因,优先使用内联函数而不是复杂的宏。

  函数内联问题

  除了 相关的问题, 内联扩展一般,语言功能作为一个内联函数可能不被视为有价值的。通常,一个编译器是在一个比人类更有利的地位来决定某一特定功能是否应该被内联。

  随着功能的演变,以前不适合内联的函数有可能成为合适内联。 建立或取消内联函数比从宏转换为更容易,但仍需要额外的维护,但产生的收益不是很大。

  使用本机C型编译系统的扩散可以增加编译时间,因为他们的身体的中间表示是到每个调用点,他们都是内联复制内联函数。在代码大小可能增加是由在编译时间可能增加镜像。

  C++中内嵌的规范要求只有一个额外在另一个编译单元,功能的外部定义时,相应的内联定义,可以发生在不同的编译单元多次,如果该函数用于地方。这很容易导致连接器,因为这样的定义不是由程序员提供的错误。 出于这个原因,往往是在C99内联一起使用静态的,也给出了函数的内部联系。

  在C + +,有必要定义一个在每一个模块(编译单元)内联函数使用一个普通的功能,而必须在只有一个模块中定义它。否则,就不可能编制的所有其他模块一个模块独立。

  对于功能问题与优化本身,而不是语言,请参阅使用内联扩展问题 。

  内联函数是使用inline关键字声明的函数,也成内嵌函数,它主要的作用是解决程序的运行效率。

  使用内联函数的时候要注意:

  1.递归函数不能定义为内联函数

  2.内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。

  3.内联函数只能先定义后使用,否则编译系统也会把它认为是普通函数。

  4.对内联函数不能进行异常的接口声明。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分