我们在面试或是笔试的时候都会被问到stack和heap的区别。这里做一个简单的介绍。

首先,这里说的heap不是数据结构的堆,数据结构里的堆是一种数据结构,是二叉树的一种。stack也不是数据结构的栈,数据结构里的栈是一种数据结构,是一种先进后出的结构。而今天我们所讲的stack,heap指的是变量在内存中所存放的位置。

一般情况下,变量在内存中存放的位置有3种:

1. 栈(stack):函数的形参,函数中的局部变量等由编译器自动释放分配的变量。

2. 堆(heap) :内容由程序员自己控制,比如通过malloc,new所开辟的内存空间。

3. 静态区域:包括全局变量和静态变量都存在这儿。

从申请动作来讲:

1.stack:是由系统自动分配,比如程序中声明int b;则系统就在内存中自动为b分配一个空间存储。

2. heap:是由程序员自己申请,并指明需要多大的空间。

从系统响应来说:

1.stack:只要系统中的stack还没满,并且可以满足申请的大小,那么就会为程序分配空间,否则会出现栈溢出的现在。

2.heap:在os中会有一个管理空闲地址的链表,当程序员提出申请时,系统就会在这个链表中找到第一个满足申请大小的地址块,分给程序,并将剩余的空闲地址重新挂在链表上。很显然这样容易造成内存碎片,很浪费啊。。

从可以申请空间的大小来说:

1. stack:stack给变量分配空间时总是从高地址向低地址分配,是一块连续地址的内存空间。在windows下stack的大小为1M。

2. heap:heap不连续的空闲内存地址组成的链表,分配空间时是由低地址向高地址扩展。heap的大小受到虚拟内存(把内存扩展到硬盘上)的限制。

从申请效率来说:

1.stack:由于是系统自动分配,因此速度比较快。

2. heap:由malloc或new分配内存,速度较慢。

版权声明:本文为博主原创文章,未经博主允许不得转载。