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