为什么栈的速度比堆要快
我们都知道,堆和栈可以有两种主要的解释,一是两种常用的数据结构,二是内存中两个重要的部分。对于内存中的堆栈结构,一般来说,使用栈往往比使用堆更高效,这是为什么呢?
综合各方面的资料来看,总结大概有以下几个方面的原因:
- 栈有专门的寄存器(esp,ebp),压栈和出栈的指令效率很高,对堆的访问只能是间接寻址,并且堆内存可能被OS调度在非物理内存中(虚拟内存的缺页),或是申请内存不连续,造成碎片过多等问题。
- 堆在分配和释放时都要调用函数(MALLOC,FREE),分配时会到堆空间去寻找足够大小的空间(因为多次分配释放后会造成碎片),这些都会花费一定的时间,他们做了很多额外的工作,而栈却不需要这些。
- 栈中数据cpu命中率更高,满足局部性原理,且因为栈中数据一般是和代码段一起载入CPU内存,栈上的变量很大程度上会保存在寄存器中,因此访问更快。
- 栈是编译时系统自动分配空间,只需要简单的栈顶指针移动,而堆是动态分配(运行时分配空间),所以栈的速度快。