【编程】堆(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)的区别的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【编程】位(bit)、字节(byte)和
- 下一篇: 【编程】char unsigned in