julia中的@inline函数是做什么用的

julia的@inline函数是做什么用的

一个给编译器的标注。提示编译器这个函数可以内联。

按照帮助的说法,一般不用手动注释。小函数编译器会自动内联。
一般只给大函数做标记。

help?> @inline
  @inline

  Give a hint to the compiler that this function is worth inlining.

  Small functions typically do not need the @inline annotation, as the compiler does it automatically. By using
  @inline on bigger functions, an extra nudge can be given to the compiler to inline it. This is shown in the
  following example:

  @inline function bigfunction(x)
      #=
          Function Definition
      =#
  end

非常感谢你的解答,我还有个问题不太明白,函数的内联是什么意思?什么叫内联?

一般的函数调用会消耗栈空间,内联函数则是直接把被调用者的代码内嵌入调用者

简单理解就是把需要调用的代码复制到调用处。
效果理论上和你手工复制代码,替换掉函数调用一样。

主要是为了消除小函数的调用开销。


严谨一些的解释(C++):

inline 关键词的本意是作为给优化器的指示器,以指示优先采用函数的内联替换而非进行函数调用,即并不执行将控制转移到函数体内的函数调用 CPU 指令,而是代之以执行函数体的一份副本而无需生成调用。
这会避免函数调用的开销(传递实参及返回结果),但它可能导致更大的可执行文件,因为函数体必须被复制多次。

—— inline 说明符 - cppreference.com


使用上一般不用关心,让编译器去操心。

可以用 @code_native 观察生成的汇编来判断是否成功内联。

也可以看看别人都是怎么用的(虽然不一定是最佳实践

https://juliahub.com/ui/Search?q=%40inline&type=code

对应功能的测试也是非常好的参考材料(又看了一眼,v1.6.5 的测试有很多都是在测,因为标记为 @inline 而间接产生的 bug):

2 个赞

非常感谢您的解答,谢谢谢谢!