C/C++编译的程序占用内存的分配如图:
程序在运行期间,地址空间一直都存在。
程序的地址空间不是内存,是虚拟地址空间。
接下来详细分析函数调用时在栈区形成栈帧的过程:
1. 栈 : 后进先出,进栈push,出栈pop.
2.寄存器:①通用计数器:eax ebx ecx ...
②栈顶寄存器:esp 栈底寄存器:ebp
③程序计数器:eip(pc指针)作用:与CPU互控,保存当前正在执行指令的下一条指令的地址。
2.栈帧:栈帧存入的是地址。
为了深入学习函数和理解函数每一步实现都干了什么,那我们来深入研究函数的调用过程;
先看一段代码:用函数实现两个数的和。
- <span style="color:#000066;">#include<stdio.h>
- int Add(int x, int y)
- {
- int z = 0;
- z = x + y;
- return z;
- }
- int main()
- {
- int a = 1;
- int b = 2;
- int c = 0;
- c = Add(a, b);
- printf("%d\n", c);
- return 0;
- }</span>
函数调用完成后,释放栈帧。
注意:栈是向下生长,当存入整形元素时,因为整形元素有四个地址,所以存入时取首地址,读取时从下向上依次读取四个地址。
以上就是函数的整个调用过程