开发者学堂课程【Scala 核心编程-基础:函数(方法)的调用机制】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/609/detail/8930
函数(方法)的调用机制
内容介绍
一、案例说明
二、函数调用机制流程分析
一、案例说明
现在要探讨的话题就是函数的基本运行原理,那么,函数的调用机制如果用。比较通俗易懂的方式。
就是如图程序员调用方法,然后返回一个结果。如果放在一个内存来分析的话,就是如下这个案例。
为了让大家更好的理解函数调用机制,看1个案例,并画出示意图,这个很重要,比如 getSum 计算两个数的和,并返回结果。
新建 FunYuanli 文件,写入代码:
object Test01 {
def main(args: Array[String]): Unit = { I
val n1=1
val n2=3
val res = sum(n1, n2)
print
l
n("res=" + res)
}
def sum(n1: Int, n2: Int): Int = {
return n1 + n2
}
}
整个代码就是传入1和3然后进行返回结果。源代码的入口是从主函数开始的,那么在内存中,是怎样运行函数或者方法的呢?
二、函数调用机制流程分析
函数调用机制示意图
如图,首先在内存中有一大块空间叫做栈,栈是一种数据结构。栈是一种特别重要的数据结构,可以实现很多功能,比如说 a+b,1+2等,最底层都是栈在工作,进行的是压栈出栈的操作。当函数进入到 main 过后,在栈中会开辟一个空间为 main 主栈,在实际工作中是没有这个名字的,而是一个地址进行表示。就是栈里面是一个独立的空间,其中有 n1[1],n2[3],当它执行到这个地方后,紧接着会调用下一句话:res = sum(n1, n2),sum 传入了 n1,n2,栈中是没有这个代码的,只是不停的在出栈进栈,这里只是为了方便观看。而sum会在底层开辟一个新的独立的栈,调用后会保留现场,就是为了将来执行后可以返回,留下的一个地址。main 栈和 sum 栈都在大的栈内存空间中,只是为了方便区分化为两个。跳到 sum 语句后,println 语句会被中断,跳到 def 语句执行,在 sum 栈中,又会出现一个n1[1],n2[3],虽然名字相同,但是两个栈中 n1,n2是独立的,最后 n 1+n2的结果为4。最后结果就会返回给 sum,因为 sun 保留了现场,所以代码会从 sum 栈中回到 main 栈,返回结果为4,而一旦返回结果后,sum 栈就已经没有用了,那么在最底层是如何把sum栈拿掉的呢?其实最早在 main 栈有一个指针,当还没有 sum 栈的时候,指针是指向 main 栈的,当调用sum栈产生的时候,栈指针则指向 sun 栈顶,又当 return 返回过后,栈指针就指向 main 栈顶,而 sum 栈就不再引用了。等到 res 返回后就继续执行下面的代码,就是执行 println 语句,最后输出结果为4。后面学习递归时这个机制尤其重要。