对于编程初学者来说,会接触到一些难以理解的名字,比如heap、stack、stack等,初学者的开发过程往往比较迷惑。 今天我们就来说说堆和栈的具体区别,帮助初学者理清思路。
堆和栈的区别一直是一个永恒的话题。 为此,笔者也查阅了很多资料c语言堆和栈的区别,以防自己的理解有误,给别人造成理解上的偏差。
“堆”和“栈”
我们先从一个简单的例子来介绍一下堆和栈:
空函数()
{
int *p = (int *)malloc(10*sizeof(int));
}
这是C语言开发和学习过程中必须要学习的知识。 一块空间是动态分配的。 堆区的空间大小为40字节(在32位系统中)。 定义的指针变量p是一个局部变量,占用栈区4个字节的空间,用来存放刚才动态分配的空间的首地址。
可以看出,这句代码中包括了栈和堆,如下图所示。
堆和栈
堆和栈的区别
我们从以下几个方面比较堆和栈:
1.存储内容不同
栈:调用函数时,函数中的每个参数(局部变量)都存储在栈中。 栈底是函数调用后的下一条指令。
堆:一般在堆的头部用一个字节存储堆的大小。 堆中的具体内容由程序员安排。
2、管理方式不同
Stack:系统自动分配空间,系统自动释放空间。 例如,在函数中声明一个局部变量“int b”。 系统自动在栈中为b创建空间,栈空间在对应的生命周期结束时自动释放。
Heap:需要程序员手动申请和手动释放,并指定大小。 C语言中申请malloc函数c语言堆和栈的区别,释放free函数,C++实现new和delete。
3、空间大小不同
堆栈:获得更少的空间。 Windows下,一般大小为1M或2M。 当剩余栈空间不足时,分配失败溢出。
Heap:获取的空间与系统的有效虚拟内存有关,比较灵活,较大。
4.是否能产生碎片不同
栈:无碎片,空间连续。
堆:采用链表的存储方式,会产生碎片。
5、成长方向不同
栈:向低地址扩展的数据结构,是一块连续的内存区域。
堆:向高地址扩展的数据结构,是一个不连续的内存区域。 这是因为系统使用链表来存储空闲内存地址,这些地址自然是不连续的,而链表的遍历方向是从低地址到高地址。
6、分配方式不同
Stack:有2种分配方式——静态分配和动态分配。 static是由编译器实现的,比如局部变量; dynamic是通过alloca函数实现的,编译器会release。
堆:都是动态分配的,没有静态分配的堆。
7、配送效率不同
Stack:由系统自动分配,速度更快。 但是程序员失控了。
堆:new分配的内存一般比较慢,容易产生内存碎片,但是使用方便。
以上就是栈和堆几个方面的区别。 希望以上信息可以帮助初学者区分堆和栈。