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

前言:

本篇仅为视频学习笔记

内联函数 (Inline Function)

内联函数在C++这个函数里是有的,那么在swift里面,怎么做的呢?swift内是不需要我们去声明这个函数为内联函数的。

★ 如果开启了编译器优化(Realease 模式默认会开启优化),编译器会自动将某些函数变成内联函数。

什么意思呢?我们先来理解前半段如果开启了编译器优化(Realease 模式默认会开启优化)。

我们还是打开之前的命令行项目。
选择target---> Build Settings ---> 输入optimization 如下图:



搜索一下,我们会看到有一个Optimization Level 优化级别,默认Debug情况下是NO Optimization(没有优化)。Release(打包的时候)是Optimization for Speed[-D]是有优化的。而且是speed是最快的,按照速度最快的方式去优化。如果我们开启了优化的话,它会自动将我们的某些函数变成内联函数。也就是说,Debug模式下,不会将你的函数,变成内联函数。Release就变成内联函数。Release发布版会自动将某些函数变成内联函数,也就意味这内联函数这种东西是有用的。肯定是可以优化我们程序的系统的。

那么内联函数有什么用呢?

★ 将函数调用展开函数体

举个例子

打开我们的工程TestSwift。


如上图,像这个是什么意思呢?按照我们正常的理解,肯定会执行第14行代码,一旦执行第14行代码就会调用test()这个函数,并且开辟栈空间,给这个函数,在这个函数栈空间里面,去做它相应的事情。比如说分配局部变量,做相应的操作。

等这个函数执行完之后呢?就会将它的栈空间回收,所以这里牵扯一个栈空间的开辟跟回收的一个问题。所以,一旦调用函数就会出这个问题。

思考一下,不觉得这段代码能够优化成这样 print("test")性能更好吗?如下图:


因为你这个函数里面的代码,特别的少。就是做一件什么事情,打印。还不如把函数代码抽出来,让它直接打印呢?如下图:

那么,这样不是性能更高吗?内联函数就是这个意思。内联函数会自动将函数调用展开成函数体代码。说白了,是一个怎么样的函数呢?如果你这个test是一个内联函数的话,它会之间将你的函数调用,展开成函数体print("test")。这样就是一种优化,这样可以减少函数的调用开销,就不用开辟栈空间,撤销栈空间。

Debug是没有优化的,Release是优化的,用汇编看一下到底有没有优化

在test()带一个断点,cmd + R 运行

我们之前,说过Swift是不用编写main函数的,它会把我们第一句可执行代码,当作我们程序的入口,其实并不是没有main函数,main函数编译器会帮我们搞。

你会发现,TestSwift`main是有main函数的,不过它会自己帮我们写,不用我们写而已。

我们现在看这个test函数调用转成了汇编,如下图,我们看到了:

说白了,这个函数并没有进行内联操作。那么,我们现在试着做一个什么事情呢?Debug模式改成改成优化模式,如下图:



再打个断点,cmd + R,运行一下


注意看一个问题,test已经打印出来了,改一下,在cmd + R运行一下


你会发现,那个断点进不去啊,所白了它压根没有执行test()这个代码。但是这个代码print("test123")它肯定会执行,所以这个时候,我们把断点打到print("test123")这个位置。cmd + R运行一下。


就会跳转到了汇编页面,如下图:


我们认真观察一下,首先来到最上边TestSwift`main:。main函数里面就有print函数如下图:



print上面到断点这部分就是为打印作准备的,因为你要传参吗各种。然后接下来调用print,也就说白了print("test123")这句代码放到了main函数里

所以,看的出来,我们一旦开启了编译器的优化,它确实会将我们的函数进行内联,直接将它函数体代码,放到这个位置test()。

但是注意,说的是自动将某些函数进行内联,那就是说有一些函数不会进行内联,那么,那些函数不会被内联呢?

那些函数不会被内联呢?
★ 函数体比较长
就是如果函数内部,写了很多的时候,它发现代码比较长,它就不会进行内联,它就不会将你的函数体代码放到调用的位置,如下图:

你知道为什么吗?那么,你思考一下,如果这个函数调用次数比较多,假设如下图test()调用的比较多,那么你要内联的话,那不就相当于把函数里所有代码,这里放一份,那里放一份。


那么这样导致的结果是是什么呢?那就是生成的汇编特别多,最终的机器也就是01、01特别多,所以就会导致你代码的体积就会变大,到时候你的安装包也就会变大,所以这个也是比较智能的。编译器会自动去识别,它认为合适的就会进行内联,不合适的它不会内联,说白了,上面代码,就算你开启了编译器,编译器的优化,它也会变成函数调用,不会给你做内联优化


★ 包含递归调用

如果你包含了递归调用,也不会内联。什么意思呢?思考一下,如果如下面代码这样写:


像这种,它也不会内联,因为你想想,如果这种要搞内联,那不是搞晕了吗?内联是什么意思,内联就是将函数调用展开成函数体代码,那你函数体就这一句 test()


说白了,你函数外边test(),展开后还是 test(),没完没了,就是一个死循环,所以编译器也是很聪明的,发现你有递归调用也不会给你内联。


★ 包含动态派发

什么叫动态派发呢?其实就是OC里面的动态绑定,如果包含了动态派发的函数,它也不会进行内联。

比如说,我们有两个类,一个Person类和Student类,Student类继承于Person。 Person中有一个test函数方法,子类Student,重写一下父类的test方法。如下图:


认真思考一个问题,举个例子



上边图片,的两句代码,明显是一个多态。相当于OC里面的父类指针指向子类对象。那么你想一下test这个函数这个将来肯定要动态派发的。所谓动态派发就是在运行时再决定调用谁的test。想想是不是。

程序运行过程中,根据你的变量指向的对象来调用谁。再举个例子,如果下面有个Teacher类


所以,你思考一下,到时候如下图,可能会变。



就是说到时候,可能会指向Teacher,既然你这个变量,将来指向的对象是随时可能会发生变化的。所以编译器在编译这个代码的时候,没办法确定到底是调用Teacher类、还是Student类中的test,所以这个叫做动态派发。没有办法进行内联。

想一想,内联的前提是什么?我已经确定要调用某个,比如说我确定在编译时期了你要调用某个类的test,那么就将函数体代码放到这个位置如下图:

image.png

但是,像上面这个,明显就是不行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容