栈的作用 |
您所在的位置:网站首页 › 子程序的作用和意义 › 栈的作用 |
栈 栈的特点是先入后出。符合这个特征的数据才可以在栈中存储。
栈的作用原理 一个函数设计里面,有2个问题: 1.参数传递 传递参数的目的,是为了代码可以重用,让一种方法可以应用到更多的场合,而不需要为N种情况写N套类似的代码。那用什么方法来做参数的传递?可以选择: a.为了速度快,使用cpu的寄存器传递参数。这会碰到一个问题,cpu寄存器的数量是有限的,当函数内再想调用子函数的时候,再使用原有的cpu寄存器就会冲突了。想利用寄存器传参,就必须在调用子函数前把寄存器存储起来,然后当函数退出的时候再恢复。 b.利用某些ram(随机存取存储器)的区域来传递参数。这和上面a的情况几乎一样,当函数嵌套调用的时候,还是会出现冲突,依然面临要把原本数据保存到其他地方,再调用嵌套函数。并且保存到什么地方,也面临困难,无论临时存储到哪里,都会有上面传递参数一样的困境。 2.函数里面也有可能要使用到局部变量,而不能总是用全局变量。则局部变量存储到哪里合适,即不能让函数嵌套的时候有冲突,又要注重效率。 以上问题的解决办法,都可以利用栈的结构体来解决: 1)寄存器传参的冲突,可以把寄存器的值临时压入栈里面,非寄存器传参也可以压入到栈里面。 2)局部变量的使用也可以利用栈里面的内存空间,只需要移动下栈指针,腾出局部变量占用的空间。最后利用栈指针的偏移来完成存取。于是函数的这些参数和变量的存储演变成记住一个栈指针的地址,每次函数被调用的时候,都配套一个栈指针地址,即使循环嵌套调用函数,只要对应函数栈指针是不同的,也不会出现冲突。 3)利用栈,当函数不断调用的时候,不断的有参数局部变量入栈,栈里面会形成一个函数栈帧的结构,一个栈帧结构归属于一次函数的调用。栈的空间也是有限的,如果不限制的使用,就会出现典型的栈溢出的问题。有了栈帧的框架在,我们在分析问题的时候,如果能获取到当时的栈的内容,则有机会调查当时可能出现的问题。
让我们看一下下面的一个main函数的调用实例,上面说的栈帧的情况依然,main函数调用A函数,调用B函数,再调用C函数,然后依次返回,试想当单cpu在main函数的框架运行的话,永远都在main函数厄结构里面(假设main函数是个无限循环结构),始终是在一个任务范围内,谈不上多任务。即使有另外一个任务在等待状态,如何在main函数里面跳转到另一个任务。显然在c语言的框架下,这无法实现,因为如果是函数调用关系,则本质上还是属于main函数的任务里面,不能算多任务切换。但需要注意到一个事实,此刻的main函数任务本身其实和它的栈绑定在一起了,无论是如何调用子函数,无论如何入栈退栈,栈指针都在本栈的范围内移动, 属于本任务的局部变量也和任务本身绑定了。 main() ---->A() ----->B() ------>C() |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |