理解堆和栈的区别


栈是编译器帮你自动管理的“临时工位”,堆是程序员或运行时显式申请的“长期仓库”。

下面用 5 个维度把区别拆干净,并给出 Rust / C / Python 的代码片段方便对照。


  1. 生命周期:谁决定何时回收?


  • 栈:编译器根据作用域自动插入“弹栈”指令(进入/离开花括号)。

  • 堆:程序员或库/运行时显式释放(C 的 free、C++ 的 delete、Rust 的 drop、Python 的 GC)。

{
    let x = 42;          // 栈:离开作用域立即回收
    let y = Box::new(42); // 堆:离开作用域时 Drop trait 释放
}

  1. 性能:分配、访问、缓存


操作备注
分配/释放O(1) 移动栈指针O(allocator)堆要查空闲链表
访问速度连续内存,cache 友好可能跨越页,cache miss 高现代 CPU 预取可缓解
碎片有,需要碎片整理jemalloc/tcmalloc 降低

  1. 容量与大小限制


  • 栈:几 MB 级(Linux 默认 8 MB,Windows 1 MB)。

  • 堆:受进程虚拟地址空间或物理内存限制(GB~TB)。

char big[8 * 1024 * 1024];   // 栈溢出 (Linux)
char *big = malloc(8 * 1024 * 1024); // OK,在堆

  1. 线程模型


  • 栈:每个线程独享 1 份,切换线程时切换栈。

  • 堆:进程内所有线程共享,需同步(锁或无锁算法)。


  1. 语言视角:语法糖 & 安全隐患


  • C/C++

    • 栈:局部变量;隐患:栈缓冲区溢出。

    • 堆:malloc/free,隐患:UAF、double free。

  • Rust

    • 栈:默认存放 Copy 类型(i32bool 等)。

    • 堆:Box<T> / Vec<T> / String,所有权系统保证“无悬垂”。

  • Python / Java / Go

    • 一切皆对象 → 除小整数、局部变量外,大部分在堆。

    • GC 负责回收,程序员无感,但有“Stop-The-World”延迟。


一张速查表

维度栈 (Stack)堆 (Heap)
分配者编译器程序员 / 运行时
速度极快相对慢
容量
生命周期作用域显式或 GC
线程归属每线程私有全线程共享
碎片
典型错误栈溢出、缓冲区溢出泄漏、UAF、碎片

一句话总结
把栈当成“函数调用时的临时便签”,把堆当成“进程级别的共享仓库”;前者靠编译器自动收拾,后者要么靠人、要么靠运行时。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值