局部变量和函数参数为什么要放在栈中
局部变量,顾名思义其作用域属于局部。全局的变量,意味着谁都随时随地可以访问,所以其放在数据段中。而局部变量只是自己在用,放在数据段中纯属浪费空间,没有必要,故将其放在自己的栈中,随时可以清理,真正体现了局部的意义。
这个就是堆栈框架,栈由于是向下生长的,堆栈框架就是把esp指针提前加一个数,原esp指针到新esp指针之间的栈空间用来存储局部变量。解释一个概念,堆是程序运行过程中用于动态内存分配的内存空间,是操作系统为每个用户进程规划的,属于软件范畴。栈是处理器运行必备的内存空间,是硬件必需的,但又是由操作系统提供的。
堆是堆,而堆栈就是栈,和堆没关系,只是都这么叫。栈和堆栈都是指的栈,在C程序的内存布局中,由于堆和栈的地址空间是接壤的,栈是从高地址往低地址发展,堆是从低地址往高地址发展,堆和栈早晚会碰头,它们各自的大小取决于实际的使用情况,界限并不明朗,所以这可能是堆栈常放在一起称呼的原因吧。
函数参数为什么放在栈区呢?第一也是其局限性导致,只有这个函数用这个参数,何必将其放在数据段呢?二是因为函数是在程序执行过程中调用的,属于动态的调用,编译时无法预测何时调用及被调用的次数,函数的参数及返回值都需要内存来存储,如果是递归调用的话,参数及返回值需要的内存空间也就不确定了,这取决于递归的次数。有些体系结构的计算机也把函数参数放到寄存器里面去。
总之,在函数的编译阶段根本无法确定他会被调用几次,其参数和函数的返回地址也要内存来存储,所以也不知道其会需要多少内存。