You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言内存疑问:声明1GB字符数组未占用RAM,写入后才占用?

为什么C语言声明大数组不占物理RAM,写入时才占用?

这是个非常典型的现代操作系统内存管理问题,核心原因在于虚拟内存的惰性分配和**写时复制(Copy-On-Write)**机制,我来给你拆解清楚:

1. 虚拟地址 vs 物理内存的本质区别

当你在代码里声明char ___storage___[1073741824];这个1GB数组时,操作系统只是给你的程序划了一段虚拟地址空间——相当于给你画了个“1GB内存的饼”,但并没有真正把物理RAM(也就是你电脑内存条里的实际空间)分配给你。

虚拟地址空间是每个进程独立拥有的“私有地址范围”,它和物理内存之间靠页表做映射,但这种映射不是一开始就全部建好的,而是按需建立。

2. 惰性分配:操作系统的“省钱”策略

现代操作系统为了高效利用宝贵的物理内存,普遍采用惰性分配策略:

  • 当你只是声明数组但不做读写操作时,操作系统完全没必要为这段虚拟地址分配物理内存页(通常一个内存页是4KB或更大),自然不会占用RAM。你看到的10字节左右的占用,只是程序本身的栈帧、基础寄存器数据这类极小的开销。
  • 只有当你第一次往数组里写入数据时,CPU会尝试访问对应的虚拟地址,发现这个地址还没绑定到物理内存,就会触发缺页异常(Page Fault)。这时候操作系统才会真正从物理RAM里拿出一块内存页,把它和你的虚拟地址绑定,再把你写入的数据存进去。

3. 写时复制:共享零页进一步省内存

还有个细节:未初始化的栈(或堆)内存,操作系统通常会把它们映射到一个全局的“零页”——所有需要零初始化内存的进程都可以共享这个页。当你第一次写入数据时,操作系统会复制这个零页,生成一个属于你进程的私有物理页,再把你写的数据放进去,这就是写时复制机制,能避免提前占用不必要的物理内存。

结合你的代码看

  • 第一个程序里,数组只存在于虚拟地址空间,没有任何写入操作触发缺页异常,所以操作系统不用分配物理RAM,RAM占用几乎可以忽略。
  • 第二个程序的循环写入操作,会不断触发缺页异常,让操作系统逐步分配物理页,所以你能看到RAM占用随着写入操作上升到对应的大小。

内容的提问来源于stack exchange,提问作者itmanwork

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:06:15