堆空间/栈空间

【相关内存空间】

  • [栈空间(stack)]:由编译器自动分配释放,一般用于保存指令地址,函数参数与局部变量值等;
  • [堆空间(heap)]:由用户控制分配与释放,保存内容由用户决定,若程序结束时用户未回收,程序将自动回收,结构类似于链表而不是数据结构中的堆;
  • [静态区与全局区]:非栈空间与堆空间,是一块在系统中共同的固定内存,用于存放全局变量与静态变量,在程序结束后,由系统自动回收;

【堆与栈的区别】

  • [申请方式]:栈区由编译器自动分配释放,而堆区由用户主动申请,如:new;
  • [申请后的系统响应]:栈剩余空间只要大于申请空间即会分配,否则将报栈溢出;对于堆,系统中存在记录空闲内存地址的链表,当申请空间时,系统会首先遍历该链表,寻找第一个空间大于申请空间的内存地址节点,将其从链表中删除,并分配给用户,大多数操作系统会在内存空间的首地址记录分配空间大小,以便delete删除内存空间,剩余的内存空间将由操作系统收回;
  • [申请空间大小限制]:栈空间是一块连续的内存区域,向低地址扩展的数据结构,栈顶地址与空间大小是系统预先设置的,在Windows下一般为2M,空间固定较小;堆空间不连续,向高地址扩展,空间大小受限于系统有效的虚拟内存,因此空间灵活且较大;
  • [申请效率]:栈空间由系统自动分配释放,效率高;堆空间由用户申请,效率较低但使用方便;
  • [存储内容]:栈空间用于函数调用时,入栈数据依次为:主函数下一条指令的地址,函数参数,局部变量(静态变量不入栈,与全局变量存储在固定内存),函数调用结束后,数据出栈依次为:局部变量,函数参数,执行主函数下一条指令;堆空间,空间首部记录分配空间的大小,其余空间用户自定义;