上一页 下一页

C 语言编程基础

动态数据结构:堆

操作系统和多个应用程序及其全局变量和堆栈空间都会占用部分内存。当程序完成执行时,它会释放内存供其他程序重用。请注意,内存空间的一部分在任何给定时间都处于未使用状态。

典型的个人计算机或工作站今天通常安装有 16 到 64 兆字节的 RAM。使用一种称为虚拟内存的技术,系统可以在机器硬盘上交换内存片段,为 CPU 制造一种拥有更多内存的错觉,例如 200 到 500 兆字节。虽然这种错觉对 CPU 来说是完整的,但有时会从用户的角度极大地降低速度。尽管有这个缺点,虚拟内存是一种以廉价方式“增加”机器 RAM 容量的极其有用的技术。为了本次讨论的目的,我们假设一台典型计算机的总内存空间为例如 50 兆字节(无论该内存是实内存还是虚拟内存)。

机器上的操作系统负责管理 50 兆字节的内存空间。操作系统以几种不同的方式使用该空间,如下所示。

广告

这当然是一种理想化,但基本原则是正确的。如您所见,内存存储了机器上当前运行的不同应用程序的可执行代码,以及操作系统本身的可执行代码。每个应用程序都有一部分全局变量与其关联。这些变量也占用内存。最后,每个应用程序都使用一个名为堆栈的内存区域,该区域存储了任何函数使用的所有局部变量和参数。堆栈还记录了函数调用的顺序,以便函数正确返回。每次调用函数时,其局部变量和参数都会被“压入”堆栈。当函数返回时,这些局部变量和参数会被“弹出”。因此,程序的堆栈大小在程序运行时不断波动,但它有一个最大尺寸。

当程序完成执行时,操作系统会将其、其全局变量和堆栈空间从内存中卸载。新程序可以在稍后时间使用该空间。通过这种方式,计算机系统中的内存会随着程序的执行和完成而不断“回收”和重用。

通常,计算机总内存空间的大约 50% 在任何给定时刻都可能处于未使用状态。操作系统拥有并管理这些未使用的内存,它们统称为。堆非常重要,因为它可供应用程序在执行期间使用 C 函数 malloc(内存分配)和 free。堆允许程序在执行过程中精确地分配所需的内存,而不是通过特定大小的数组声明预分配。