
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
堆与栈是程序员在学习计算机编程开发技术的时候需要重点掌握的两个编程知识点,下面我们就通过案例分析来了解一下,堆内存与栈内存的区别都有哪些。
1、栈
栈一块连续的内存块,栈上的内存分配就是在这一块连续内存块上进行操作的。编译器在编译的时候,就已经知道要分配的内存大小,当调用函数时候,其内部的遍历都会在栈上分配内存;当结束函数调用时候,内部变量就会被释放,进而将内存归还给栈。
2、堆
堆(heap)是一种内存管理方式。内存管理对操作系统来说是一件非常复杂的事情,因为先内存容量很大,其次就是内存需求在时间和大小块上没有规律(操作系统上运行着几十甚至几百个进程,这些进程可能随时都会申请或者是释放内存,并且申请和释放的内存块大小是随意的)。
堆这种内存管理方式的特点就是自由(随时申请、随时释放、大小块随意)。堆内存是操作系统划归给堆管理器(操作系统中的一段代码,属于操作系统的内存管理单元)来管理的,堆管理器提供了对应的接口_sbrk、mmap_等,只是该接口往往由运行时库进行调用,即也可以说由运行时库进行堆内存管理,运行时库提供了malloc/free函数由开发人员调用,进而使用堆内存。
3、堆与栈区别
理解堆和栈的区别,对我们开发过程中会非常有用,结合上面的内容,总结下二者的区别。
对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak
空间大小不同
一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。
对于栈来讲,一般都是有一定的空间大小的,一般依赖于操作系统(也可以人工设置)
能否产生碎片不同
对于堆来讲,频繁的内存分配和释放势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
对于栈来讲,内存都是连续的,申请和释放都是指令移动,类似于数据结构中的进栈和出栈
增长方向不同
对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向
对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长
分配方式不同
堆都是动态分配的,比如我们常见的malloc/new;而栈则有静态分配和动态分配两种。
静态分配是编译器完成的,比如局部变量的分配,而栈的动态分配则通过alloca()函数完成
二者动态分配是不同的,栈的动态分配的内存由编译器进行释放,而堆上的动态分配的内存则必须由开发人自行释放
分配效率不同
栈有操作系统分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高
堆内存的申请和释放专门有运行时库提供的函数,里面涉及复杂的逻辑,申请和释放效率低于栈
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。