本文主要是介绍Invoke a function in computer,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
面试中被偶然问起知不知道一个函数调用另一个函数再计算机中是如何进行的,这应该属于汇编语言的范畴,完全忘了,特此简单记录一下相关的general idea。
方式一:
最常见的调用和传递参数形式就是依赖于这个线程的栈。每个线程都有自己的栈,调用函数的时候,相应的参数被push到stack的顶端,然后被调用函数过来提取相应个数的顶部参数即可。
方式二:
当函数参数个数很少或者大小很小的时候,可以被直接放到register里,stack都是再内存里,当然没有register读取来的快。当然方式一和二并不是完全独立的,在老式计算机里,也存在共用的情况,比如,部分参数放在register里,register数量有限,其余的放在stack里。但因为之后的计算机cache容量更大了,所以其实stack读取一次之后,邻近的内存单元读取会快很多,计算机在参数传递的策略上也会不一样,可能都放在stack里就可以。而且register存在overwrite的问题,可能前一个函数还有值存在register里,后一个函数改动之后还有将前一个函数的参数备份存储的问题。
方法三:
对于reentrant的函数,主要是上述两种可能性。对于non-reentrant 函数,典型特征就是没有办法recursive调用自己的函数,parameter会被放在global variable里,全局变量当然也是在内存中的一块。因为non-reentrant 没有自己的stack。
还是要说的就是,这只是基本的几种可能的策略,实际问题里可能会有很多的变化,因为这里跟硬件结构,约定的习惯有关。以上的经验主要基于8086结构。面试的时候答出general idea即可。个人意见,仅供参考。
这篇关于Invoke a function in computer的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!