堆和栈有什么区别?哪个比较快?

我们都知道,windows内存区域无外乎堆、栈、静态区、常量区,下面主要说一说堆和栈。

首先我们要注意一个容易混淆的点,我们经常会听人把堆栈连起来说,通常堆栈指的是栈,而不是堆。

什么是堆?

需要程序员自己申请,并指明大小。

什么是栈?

由编译器自动分配释放 ,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等。

堆和栈的区别

  • 申请方式不同:堆由程序员手动分配和管理,而栈由系统自动分配和管理。
  • 效率不同:堆速度较慢,而且很容易产生内存碎片。栈效率高,不会产生内存碎片。
  • 扩展方向不同:堆由低地址向高地址扩展,而栈由高地址向地址扩展。
  • 大小限制不同:堆的大小基本没有软限制,只有硬限制(内存),而堆的大小在某一刻起就已决定(具体是编译时还是运行时还有待求证,具体默认大小的说1M,2M,4M的都有,可能在不同环境下结论不同),具体大小可以在编译器编译时手动指定(vs在项目->属性->系统->堆栈保留大小)。

什么是栈溢出(stack overflow)?

栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数,因而导致栈中与其相邻的变量的值被改变。

栈溢出的原因有哪些?

  • 局部数组过大
  • 递归调用层次太多
  • 指针或数组越界

为什么栈比堆要快?

栈是操作系统提供的数据结构,计算机底层对栈提供了一系列支持:分配专门的寄存器存储栈的地址,压栈和入栈有专门的指令执行;而堆是由C/C++函数库提供的,机制复杂,需要一些列分配内存、合并内存和释放内存的算法,因此效率较低。