00:00
对,现在我们要探讨是什么话题呢?诶,函数的基本的运行原理对不对,这个还是要了解一下的啊,虽然同学们以前可能学过,对吧,我再唠叨几句,那么函数的调用机制呢,如果用一个比较通俗易懂的方式,就是诶,程序员调用一个方法,或者是一个函数,它返回一个结果,就这么简单,对,就这么简单,那么如果说我们放在这一个,呃内存来看待呢,它是这么一个流程,大家看我,我这里呢,写了一段非常简单的代码。为了让大家能够更好的理解函数的调用过程,或者调用的机制啊,调用的机制吧,调用机制比较好,机制我们看一个案例,画出示意图,这个很重要,那么比如我有这么一段代码来,朋友们。我把这个呢写到这里来,我们专门讲函数的调用机制,好,先写一个。小案例对不对?好,我们叫function的一个原理啊。
01:03
啊,Function的一个原理贴。那这个原理是怎么写的?E是吗?这有点忘了这个单词啊。呃,原理啊,这样写。好,走,我们来跑一个。我们跑一个代码呢,我这里已经有一段代码了,我就不再去重写,我再不再重写,我把这个拿过来大家看一下,这有一个写的求和的一个方法,跟刚才类似,这个我简单就是求两个数的和,然然我这里有一段小小的代码,就是来计算它的结果,好,我们来玩一把。这个代码同学们一看是非常简单的,就是传了一个N,传了一个一和三,把这个结果计算出来再返回,这个对我来说几乎没有任何难度,特别简单,但是我要讲的呢,并不是呃,这个代码的结果,而是它到底在我们的这个内存里边,它是怎么去运行的。
02:06
你只有把这个搞清楚了以后呢,同学们以后再对这个复杂的代码,你才能看得懂,那这样子啊,我们把这段代码。拿到我们的这个地方来。好,这样子,我把所有的这些图啊,我都放在这个地方去,好吧,我都统一的放在这儿。那现在呢,我们聊一个话题,聊一个什么话题呢?就是函数,当然函数这样方法也是这样子啊,函数或者是方法的这个调用机制。调用机制说明好,给大家写到这里来。注意听啊,尤其是咱们这个,呃,有些同学呢,这个接触的程序时间还不多的时候,要注意听,好我把这个源码先放到这个位置。啊,这是我们的源代码。非常简单的一段源代码,现在我们来看怎么跑呢?比如说我们的代码,大家都知道它的这个入口应该是从主函数入口的,这点是同学们,呃,在学第一天的时候,老师就讲过这个东西,那现在呢,在我们的内存里边,假如这是一块大的内存。
03:18
这是一块内存,这是我们的内存。OK,那么内存里面它怎么去运行我们的这个函数或者是方法呢?首先在我们内存里面有一大块空间叫做占。啊,这个老师以前应该也讲过,这个地方是一个站。善。OK,等一下,诶,这个地方标标成这个玩意啊,是一个站,站是一个什么东西呢?站是一个数据结构。诶,老师以前讲过站是不是一种数据结构啊,那么我问大家站最大的特点是不是先进,怎么样很先进后出同学们呢,这个对这个站要理解啊,就是呃,在我们数据结构里面,暂时一个特别重要的数据结构,它可以实现很多的功能。
04:06
比如说最基本的A加B1加二一减这些全部,其实底层整个这个东西全是站在工作,你比如说一个学完数据结构的人,他看到这个东西跟你们看的不一样的,他看这个啊八。乘以三减去三,他当他看到这个东西的时候,他的脑海里面其实会出现两个站,两个站,这两个书在不停的往压战出战,压战出战,最后这个拿到这个结果的。也就是说这个计算结果之所以拿到它在底层那个我们叫做存储器里边,其实它是压站出站的一种机制来玩的,同学们有兴趣呢?有如果将来有兴趣可以看一下这个站。这这个这个数据结构啊,呃,有兴趣以后可以去看一看啊,现在呢,先暂时不去看好,我们现在接着往下走,当我们函数进入到这个命过后呢,它首先会在这个大战里面开辟一个空间。
05:06
占空间我们标一个颜色,比如我们把这个叫做主占,就以这个函数名命名啊这个命占,注意这个命站是我写的名字,在实际过程中呢,他没有这个名字,他直接是用个地址来表示的,就这个站里面是一个独立空间,他会干什么呢?他发现这有一句话,于是他在这个站里面呢,就有一个N1。N1。N1是多少呢?就是一,因为它是一个整数,我就写到这N2又来了,是什么呢?是三。好,又,又来NN23,好,紧接着呢,他又调用了这句话。好,我这个就就就说一次,当他做到这个地方的时候,执行这句话的时候,注意res等于一个上的时候,他把这个N1和N2传到这里面去,那么。
06:01
注意啊,这个地方是我写的,是我自己写的,其实其实在站里面没有代码,站只是不停的在入站出站,只是我为了让大家理解,我这写了一个这样的代码,他会干什么呢?一看到这个上。就是在我们底层编译器一看这个上面,它就会开辟一个新的站。这个站往上走。那么他在地方调用之前会保留现场,它会保留一个现场。保留现场好保留现场,什么要保留现场呢?就是为了为了将来执行完毕过后可以返回他这保留个现场,其实说说白了就是留了一个地址,将来我要回退到哪个位置。好,这个站呢,是一个新的站,独立的站。啊,当然当然整个,呃,其实他们之间都在这个大战里边,只是呢,呃,为了区分,我把它画成两个独立的空间,那这个时候会有一个什么呢?叫一个上。有一个上啊,这个呢,我们叫上战。
07:03
啊,这里边儿会干什么呢?它就相当于代码就跳到这来了。那注意,当他跳到这个地方时候,最下面这句话还没有执行呢。就是说这句话会被中断。这句话未必会,会等待执行,就是先到这来执行,执行过后这有个N1和N2,会怎么样呢?在这个站里面又会出现一个N1,这个N1的值是多少呢?就是你这传进来的N1,你是一,那么我也是一。好,这个地方又接受一个N2,在这个站里面呢,也会有个便利的,N2是多少呢,是三。啊,也就是说大家看命这个站和你调用这个函数生成站呢,它们都有N1和N2,但是们是不同的变量,虽然名字都是一样。虽然名字都是一样,但实际上它们是独立的,他们是独立的,好最后你这N1加N2这个值返回来这个算出来这个结果是多少呢?是四。
08:00
啊是四好是四呢,是四的话,这个结果就会返回给哪里呢?返回给他。也就是说,因为他保留一个现场,那么代码呢,就会从这里直接推到这里,把这个结果返回给他,那这个结果是多少呢,就是四。好,问题来了,那么请思考。一旦我们这个这个地方返回过这个站,其实就已经。没有用了,或者说已经。已经没有了,那么在数据结构或者在编译器底层,它是怎么把这个上这个站拿掉的呢?它是这样子的,同学们。最早的时候,它这里的站有个指针。他先当你第一次,呃,就说当还没有去,当还没有这个站的时候,他这个站实际上是指到这地方,指到他的,当你调用了一个上产生一个站过后,这个站点就会移植到这个位置。当你返回就是return,返回过后呢,这个站。
09:00
他就这个站就往下来了,占领就相当于说这个我们目前这个数据结构的占呢,占领在这个命占相当于这个地方,它就不再引用了,明白这意思吧,好就是这么一个逻辑,就这么一个逻辑,好最后这个结果你返回来以后呢,这个返回给result,继续截取下面代码,下面代码是什么呢?就这个print print是什么呢?Print就是四好,这就是我们的四结果就出来了,好整个这个流程我就给他走了一遍啊,这个只走一次,后面呢,咱们这个学递归的时候,这个机制就特别重要,好我把这个就说清楚了,说清楚了来老师呢,把刚才讲的这一段代码给大家整理到这里,叫什么呢?函数的一个调用机制的一个示意图。好。好,我先把它拿到这里来啊,那就是函数调用机制,来一个标题二。好的,那刚才我们讲的是什么呢?诶讲的是这个东西啊,讲函数调用机制,用了一段代码来说明它的调用过程。
10:05
来标题三。标题三,好的,那这个案例我就直接啊给同学们放到我们的笔记中去就可以了,大家理解一下。好,同学们,我把它放到笔记中去,对不对?没问题了。O了,好,这是我们函数的调用机制。
我来说两句