美文网首页Swift 底层进阶Swift
★ iOS高级:Swift入门精讲③ 01 swift编程-01

★ iOS高级:Swift入门精讲③ 01 swift编程-01

作者: 麦穗0615 | 来源:发表于2019-07-26 13:53 被阅读0次

    前言:

    本篇仅为视频学习笔记

    @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。

    备注:

    本篇是对内联函数进行了补充,最好结合前面学习的内联函数章节进行学习,地址如下:

    ★ 学习笔记:《iOS高级:Swift入门精讲②》第一节 Swift编程-01➡10 内联函数

    相关文章

      网友评论

        本文标题:★ iOS高级:Swift入门精讲③ 01 swift编程-01

        本文链接:https://www.haomeiwen.com/subject/xherrctx.html