堆/栈 内存管理相关

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

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

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

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

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

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

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

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

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

猜你喜欢

转载自www.cnblogs.com/EvansPudding/p/12566311.html