★ iOS高级:Swift入门精讲③ 01 swift编程-01
前言:
本篇仅为视频学习笔记
@inline
说到这个@inline,我们看一下之前,我们讲的一个东西。之前我们讲过内联函数,内联函数怎么说的?是不是编译器一旦开启了这个优化的话,它会自动将某些函数变为内联函数,但是它是有条件的,哪些函数是不能内联呢?
如果说你的函数体(函数代码)比较长,或者你这个函数存在递归调用,或者说你这个函数包含动态派发,像这些都不会自动内联。
如果说函数体比较短的,不存在递归调用,也不存在动态派发,一般来说它会自动内联。
实际上它也提出了一个关键字,让你可以稍微控制一下内联的一个行为,那么怎么稍微控制呢?
第一种
// 永远不会被内联(即使开启了编译器优化) @inline(never) func test() { print("test") }
第一种,直接@inline(never),never是从来不的意思,那么这样一写是什么意思呢?这样写就代表即使我们开启了编译器优化,那么这个函数也不会被内联。永远不会被内联。test函数中的代码只有一行,按照正常来讲,一旦我们开启了编译器优化,那么这个函数百分百会被内联。
但是,你加上这个@inline(never),它永远不会被内联。
第二种
// 开启编译器优化后,即使代码很长,也会被内联(递归调用函数、动态派发的函数除外) @inline(__always) func test () { print("test") }
还有一个就是@inline(__always) 中,注意always)前面是两个下划线。这样是什么意思呢?always这个单词看起来,还像是永远的意思,实际上,它是有前提条件的。
什么前提条件呢?前提是开启编译器优化,也就是说你加上这个__always是什么意思呢?即使你这个函数里面代码非常的长,比如说函数体比较长,它也会被内联。
认真思考一下,在以前的话,默认情况下,是什么样子?就是发现你的函数体比较长,它是不会被内联的。但是你加上__always之后,开启了编译器优化的话,代码很长,也会被内联。
当然,加上这个关键字__always,如果你没有开启编译器优化的话,它依然不会被内联,也就是说要搞清楚,不是你加上这个__always之后,它一定会内联。还有一个前提条件,你还得必须开启编译器优化才可以。也就是说在Debug模式下,你加__always是没有用的。
还有一个问题,你加上这个__always之后,如果函数包含递归调用函数、动态派发,依然是没有效果,也就是说,依然不会被内联。
所以说,加上这个关键字,什么情况下,才可以内联呢,开启编译器优化之后,即使代码很长也会被内联。
★ 在Release模式下,编译器已经开启优化,会自动决定哪些函数需要内联,因此没有必要使用@inline。
备注:
本篇是对内联函数进行了补充,最好结合前面学习的内联函数章节进行学习,地址如下: