什么是栈分配?
栈分配是一种运行时存储管理技术。激活记录分别在激活开始和结束时被压入和弹出。
每个过程调用中的局部变量的存储都包含在该调用的激活记录中。因此,局部变量在每次激活中都绑定到新的存储空间,因为在进行调用时会将新的激活记录压入栈中。
可以在运行时确定变量的大小,因此局部变量可以在不同的激活过程中具有不同的存储位置和不同的值。假设已注册的顶部标记栈的顶部。在运行时,可以通过分别将顶部递增和递减记录的大小来分配和释放激活记录。
如果过程 q 的激活记录大小为 a,则在执行 q 的目标代码之前,顶部将递增 a。当控制权从 q 返回时,栈的顶部将递减 a。
UNIX 平台上 C 程序的内存组织如下:
在 C 中,数据可以是全局的,这意味着它被分配到静态存储区并且可供任何过程使用,或者它是局部的,这意味着只能由声明它的过程访问。一个程序由一个全局数据声明列表和声明它的过程组成。
有两个指针,一个是指针栈(SP),它始终指向当前激活过程的激活记录中的特定位置。第二个指针称为顶部,它始终指向栈的顶部,即激活记录的顶部。
临时变量用于表达式求值,并分配在激活记录之上。激活记录是一种在调用过程/函数时激活/创建的数据结构,它包含以下有关函数的信息。
“C”语言中的激活记录包括
- 实际参数
- 参数数量
- 返回地址
- 返回值
- 旧栈指针 (SP)
- 函数或过程中的局部数据
旧 SP存储调用此过程并导致生成此激活记录的过程的激活记录的栈指针值,即它是指向调用方的激活记录的指针。
可选访问链接 - 它定义了保存在另一个激活记录中的非局部数据。
可选控制链接 - 它指向调用方的激活记录。
实际参数 - 调用过程使用它向被调用过程提供参数。
返回值 - 被调用过程使用此字段将值返回给调用过程。每个字段的大小在调用过程时确定。几乎所有字段的大小都可以在编译时确定。
广告