首页>>科技 >>内容

如何分清堆和栈的区别 7大关键点

发布时间:2023-10-13 20:30:09编辑:温柔的背包来源:

如何分清堆和栈的区别 7大关键点

很多朋友对如何分清堆和栈的区别,7大关键点不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

编程初学者会接触到一些难以理解的名字,比如堆、栈、栈等等。新手的开发过程往往比较混乱。今天就来说说堆和栈的具体区别,帮助初学者理清思路。堆和栈的区别一直是个永恒的话题,所以我也查了很多资料,防止自己理解错误,给别人造成误解。从一个简单的例子开始:void function(){

int * p=(int *)malloc(10 * sizeof(int));}这是开发和学习C语言过程中不可避免要学习的知识。动态分配一个空间,堆区的空间大小为40字节(32位系统中)。定义的指针变量p是一个局部变量(在堆栈区占用4个字节的空间),用来存储刚刚之前动态分配的空间的第一个地址。如您所见,这段代码包含堆栈和堆,如图1所示。图1堆和栈我们从以下几个方面比较一下堆和栈:

(1)存储内容不同的堆栈:当一个函数被调用时,堆栈在函数(下面调用函数后的下一条指令)中存储各种参数(局部变量)。堆:通常,堆的大小存储在堆头的一个字节中。堆中的具体内容由程序员安排。(2)管理方式不同。

堆栈:空间由系统自动分配,空间由系统自动释放。比如在函数中声明一个局部变量int b;系统自动在栈中为B创建空间,对应的生命周期结束时栈空间自动释放。堆:程序员需要手动申请和释放,并指定大小。malloc函数在C语言中应用,free函数释放,通过new和delete在C中实现。(3)空间大小不同

堆栈:获得更少的空间。在Windows下,一般大小为1M或2M。当剩余堆栈空间不足时,分配无法溢出。堆:获得的空间依赖于系统的有效虚拟内存,灵活且大。(4)是否可以生成不同的片段堆栈?不会产生碎片,空间是连续的。堆:采用链表的存储方式,会产生碎片。(5)不同增长方向的堆栈:扩展到低位地址的数据结构是一个连续的内存区域。

堆:扩展到高位地址的数据结构,是不连续的内存区域。这是因为系统使用链表存储空闲内存地址,这种内存地址自然是不连续的,链表的遍历方向是从低位地址到高位地址。(6)不同分配方式的堆栈:有静态分配和动态分配两种分配方式,静态分配由编译器完成,比如局部变量;动态性是由alloca函数实现的,编译器会释放它。堆:都是动态分配的,没有静态分配的堆。(7)不同的分配效率。

栈:系统自动分配,速度更快。但是程序员无法控制它。heap:new分配的内存一般比较慢,容易出现内存碎片,但是使用起来比较方便。以上是栈和堆的区别。希望以上信息可以帮助初学者区分栈和堆。

以上知识分享希望能够帮助到大家!