c语言函数调用 压栈,局部变量与函数调用栈

不知道从什么时候开始,运行在OS内的程序文件,有了规范,Win系统下是PE,Linux系统下是ELF。符合规范的程序能够被OS调用并执行。

不知道从什么时候开始,程序在OS的管控下执行,每个进程都有自己的堆(heap)和栈(stack)。堆的地址从小到大,存放需要程序代码显式申请的内存块,并且也需要程序自己管理和释放。栈的地址从大到小,存放函数调用过程中的指令地址和函数的局部变量。程序员需要关注堆的管理,但是栈的相关操作,由编译器完成。

在栈中存放程序返回的地址,这个是很好理解的。在栈中存放函数的局部变量,并且在函数执行完后释放这部分空间,我理解这是当初的一个很精妙的软件设计。与全局变量存放在.data数据区不同,函数仅自己使用的变量由于只有短暂的生命周期,如果使用像堆一样显式地申请和释放的方式,必然会增加程序员的代码工作量,也会增加软件出错的概率。因此,这些函数自己使用的变量,就放在了栈中,由编译器自动完成在栈中的空间申请,赋初值和释放的动作。

CPU很配合,对于这些已经成为标准的软件设计概念,贡献出对应的寄存器来支持!

刚才是一点个人的牢骚,本文后面主要记录一些关于函数调用栈的知识点。

关于压栈出栈的不同方式

对于函数调用时的压栈和出栈,其实在细节上有一些不同的实现方式,如下图,据说是VC++的标准:

你可能感兴趣的:(c语言函数调用,压栈)