C++内存管理深度解析
1. 计算机内存概述
计算机的物理内存被系统上运行的所有进程共享。如果一个进程使用了大量的内存,其他进程很可能会受到影响。但从程序员的角度来看,我们通常不需要担心其他进程正在使用的内存。这是因为如今大多数操作系统都是虚拟内存操作系统,它们提供了这样一个假象:每个进程仿佛拥有所有的内存。每个进程都有自己的虚拟地址空间。
虚拟地址空间
程序员看到的虚拟地址空间中的地址是由操作系统和内存管理单元(MMU,这是处理器的一部分)映射到物理地址的。每次我们访问一个内存地址时,这种映射或转换都会发生。这个额外的间接层使得操作系统可以将物理内存用于当前使用的部分,并将剩余的虚拟内存备份到磁盘上。在这个意义上,我们可以将物理主内存视为虚拟内存空间的缓存,后者位于二级存储中。用于备份内存页面的二级存储区域通常称为交换空间(swap space)、交换文件(swap file)或页面文件(pagefile),具体取决于操作系统。
虚拟内存使得进程可以拥有比物理地址空间更大的虚拟地址空间,因为未使用的虚拟内存不需要占用物理内存。
2. 栈内存与堆内存
栈(stack)和堆(heap)是C++中两种主要的内存分配方式。栈内存是局部的,每个线程都有自己独立