栈(Stack)和堆(Heap)是计算机内存中用于存储数据的两个重要区域。
栈是什么?
栈的内存空间由编译器生成指令操作寄存器(如push/pop)来管理,是线程或者进程上下文的一部分,由编译器和寄存器共同维护,栈的分配/释放是硬件+编译器协作的结果(如函数调用时,编译器生成指令移动栈指针)
栈为什么速度快?
硬件加速:栈操作(如push/pop)是CPU指令集的直接支持,通常只需1-2个时钟周期。
无系统开销:堆分配(如malloc/new)可能涉及用户态到内核态的切换(通过brk/sbrk或虚拟内存管理),而栈完全在用户态完成。
局部性原理:栈内存通常位于CPU缓存的热点区域,访问效率更高。
堆是什么呢?
堆是进程虚拟地址空间中的动态区域,操作系统提供虚拟内存机制,动态区域查找分配则是由运行时的库实现(如malloc使用brk或mmap申请内存,再自行管理小块分配),一个程序可以没有堆,但是不能没有栈。
堆为什么慢
系统调用开销:堆扩展时(如brk)需内核介入。
算法复杂度:查找空闲内存块(如最坏情况O(n))比栈的指针移动更耗时。
同步开销:多线程中堆分配需加锁(如malloc的全局锁),而栈是线程独享的。
对比(栈 vs 堆)
特性 | 栈 | 堆 |
---|---|---|
维护者 | 编译器+硬件寄存器 | 运行时库(如malloc )+操作系统 |
分配速度 | 极快(硬件指令) | 慢(需算法+可能系统调用) |
是否需要内核 | 完全用户态 | 可能触发内核态调用(如mmap ) |
线程安全 | 线程独享,无需同步 | 需全局锁或细粒度同步 |