欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【编程】堆(heap)和栈(stack)的区别

发布时间:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【编程】堆(heap)和栈(stack)的区别 小编觉得挺不错的,现在分享给大家,帮大家做个参考.


从C/C++的内存分配(与操作系统相关)上来说,堆(heap),栈(stack)属于内存空间的一段区域。

效率:

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持(有专门的寄存器存放栈的地址,压栈出栈都有专门的机器指令执行),这就决定了栈的效率比较高。

堆则是C/C++函数库提供的,它的机制是很复杂的。例如分配一块内存,堆会按照一定的算法,在堆内存中搜索可用的足够大小的空间,如果没有(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。总之,堆的效率比栈要低得多。

管理方式:

栈由编译器自动管理,无需人为控制,存放函数的参数值,局部变量的值等。当这个局部变量离开其作用域之后,所占用的内存则会被自动释放,因此在 C 中局部变量也叫自动变量。

堆一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 ,容易产生内存泄漏(memory leak)。、

空间大小:

栈一般有一定的空间大小(在VC6默认的栈空间大小是1M,也有默认2M的)。操作系统的栈在内存中高地址向低地址增长,也即低地址为栈顶,高地址为栈底。这就导致了栈的空间有限制,如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆在32位系统下,内存可以达到4G的空间(虚拟内存的大小,有面试官问过),由此可见,堆获得的空间比较灵活,也比较大。

碎片问题:

栈不存在这个问题,因为栈是先进后出,不可能有一个内存块从栈中间弹出。在该块弹出之前,在它上面的(后进的栈内容)已经被弹出。

堆频繁的 new/delete 会造成内存空间的不连续,造成大量的碎片,使程序效率降低(重点是如何解决?如内存池、伙伴系统等)。

生长方向:

栈是向低地址扩展的数据结构(先进后出),是连续的内存的区域。

堆是向高地址扩展的数据结构,是不连续的内存区域。

猜你喜欢:👇🏻
⭐【编程】位(bit)、字节(byte)和字(word)的区别
⭐【Excel】一次性快速批量删除下面多余的空白行
⭐【Visio】Visio图片在Word中显示不全?如何确定Visio作图大小?

总结

以上是生活随笔为你收集整理的【编程】堆(heap)和栈(stack)的区别的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。