暂时忽略现代操作系统所需的虚拟内存和内存管理解决方案。
嵌入在可执行文件中的是包含全局变量的固定/静态数据所需的内存量。数据段 (DS)(硬件)寄存器跟踪这些固定数据元素。DS 金额不变。DS 指向一块连续的内存。如果没有足够的连续内存,则会出现内存不足错误并且程序不会加载。正如您所说,在程序执行期间,此内存不会“超出范围”。
局部变量是从由堆栈段 (SS) 寄存器管理的内存的另一部分分配的。SS 管理的内存量在程序执行期间会增加和减少。最大和最小大小由操作系统 (OS) 确定。(这些大小不是基于当今复杂操作系统中的物理内存大小)
如果在执行期间超过最大数量,则会出现堆栈溢出错误。
如果最小尺寸不可用,则程序不会执行。所以 pgm 至少从最小数量开始。如果在执行过程中需要更多的 SS 内存,操作系统将增大内存块 - 如果可能,则堆栈溢出错误。
当一个函数被调用时,它的局部变量是从 SS 分配的(有点像全局变量在 DS 中的分配方式)。SS 中还有其他的管理项,例如函数退出时的去向(即调用函数之后的代码的地址)。随着函数以嵌套方式调用其他函数,堆栈不断增长。随着每个函数完成执行,控制权返回到调用函数,完成函数的局部变量被释放,堆栈收缩。
“堆”内存是另一块内存,它根据需要增长以保存在程序执行期间“创建”或“分配的内存空间”的项目(根据语言使用“malloc”或“new”或类似的动词) . 与 SS 一样,操作系统确定最小和最大大小,每个 pgm 至少以最小数量开始。
当今的现代 CPU、操作系统、语言中内置了保护层,以确保正确处理物理内存的内容,即不能执行数据块,也不能写入/读取代码块。
虚拟内存,需要移动内存块以允许多个程序运行(内存管理)和摆脱超出范围的堆项目添加了另一层,但上面详述的基本原理仍然适用。