首页 > 其他 > 详细

堆/栈 内存管理相关

时间:2020-03-25 16:20:04      阅读:52      评论:0      收藏:0      [点我收藏+]

栈区由系统自动分配,自动在栈区申请内存,在存储上是连续的,如果我们在visual studio去查看栈区空间,debug模式下编译器会做一些处理,在分配之间留一些空间,但是实际分配上它是连续存储的,是从高地址向低地址扩展的数据结构,在这种情况下,栈顶的地址和他的最大容量,是固定的,一般来说大概就2m或者1m。

之所以叫栈也是因为这个原因,就是在一个作用域里,比如说左括号,开始分配内存,当遇到右大括号,把分配的内存再统统销毁掉,这就是先进后出的一个栈结构。

比如我们申请一个局部变量的int 。系统就会自动分配,当出了作用域之后,系统就会把分配的内容回收销毁掉。

如果栈的剩余空间不够了,就会导致栈溢出。

分配栈空间是非常快速的,类似于在机器码中一条cpu指令,因为不需要去做很多额外的操作。

 

而堆空间,需要程序自己去控制,通过new/malloc来申请分配堆内存空间,然后再通过delete/free去释放掉内存空间,比起栈分配来说,它不会出了作用域之后就销毁掉,会保留在整个程序运行时间内,直到程序结束。

堆空间的申请比起栈空间更加的复杂和缓慢。

在操作系统中有一个空闲地址的链表,当我们分配堆内存的时候,首先回去在链表里去寻找空闲的空间,把这个堆节点从空闲列表中删掉,然后再把空闲空间分配给程序,多余的这部分还会重新放入到空闲链表中

他是一个向高地址扩展的数据结构,而且因为这个特性,也是不连续的内存区域,堆内存也比较大。但是耗费成本高,所以申请、使用、删除耗费的成本比栈空间要大。

 

堆/栈 内存管理相关

原文:https://www.cnblogs.com/EvansPudding/p/12566311.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!