为什么要定义无参函数,是否可以访问调用函数内部的临时栈变量?

背景:

最近,我在看linux源码函数,当然了,不是细致的查看,只是查看linux源码各个函数内部函数调用,临时变量定义+读写、对全局变量的访问,有了一些心得,记录下来:

1、为什么linux源码中大量定义并调用了含参函数,而为什么单片机代码往往定义无参函数?

我以前的想法是:之所以定义无参函数是因为函数内部是为了完成某个动作,而非得到计算得到某些数值。

我现在的想法是,无参函数无需使用调用函数内部的临时变量、参数变量值、参数变量指向的变量,而是直接调用全局变量、或者类似全局变量的寄存器。单片机程序相对简单,而且很多操作都是基于全局变量以及寄存器读写操作。所以好多单片机程序员习惯直接使用无参变量。

也就是标题说的:无参函数是无法使用调用函数内部临时变量、参数变量、参数变量指向的变量,而只能使用全局变量。

相对的,之所以定义含参函数的目的是为了能够使用调用函数内部的临时变量、参数值、参数地址、参数指向的外部变量等。

所以,含参函数能够访问的变量范围更广,是无参函数的超集。

2、函数内部主要在做什么?

答:根据函数就是一个数据处理器,也就说函数内部不断的对参数变量、定义的临时变量(栈变量)、参数变量地址、参数变量指向的外部变量、全局变量进行读写访问。这个时候可能有人就问了,函数内部还进行调用其他函数。如果将函数名看做地址的话,函数调用也可以看做是数据处理,只不过使用的是函数代码段的首地址,也是为了处理访问外部的代码或者数据。

3、从"作用域"角度看函数内部在做什么?

首先参数变量、临时变量都是在{}内部的栈上。也就是说这个变量以及变量地址都是属于"内部变量",而函数名、参数为指针指向的变量或者结构体成员、堆内存以及对应地址等在{}外部,属于"外部变量"。函数内部不断对这些内部变量和这些外部变量进行读写访问。

内部变量是在栈内存上,外部变量是在全局变量、堆变量、代码段等内存上。

最后,如何理解栈变量?

答:栈变量是内存中开辟的一段特殊内存,对于整个代码环境来时是共用的,在不考虑多核访问,只考虑单核访问的情况,同一个时间点只能运行在一个函数内部,函数内部定义的临时变量、参数变量这些都是在栈变量上的。当调用另外一个函数的时候,调用函数还没有运行结束所以占用的栈内存还有意义不能被其他函数占用。被调用函数内部会再次分配另外一段栈变量,后面依次这样分配下去。当函数调用结束了,那么申请的栈内存就没有意义了可以被其他函数占用了。这就是为什么在一个函数内部调用多个子函数的时候,后面的子函数可以使用前面子函数曾经占用过的栈内存。所以栈内存是不断依次占用的,一个用完了,另外再用。有点想是图书馆借书,一本书被借走了,只有当换回来时候才能被其他人再借走,但是整个图书馆(栈变量)的书数量(内存大小)是一定的,而且不用太大。分配太大也浪费。

相关推荐
栗子编程2 年前
【Python函数和类2/6】函数的参数
大数据·开发语言·python·含参函数·默认值实参·关键字实参·位置实参