标签:栈、堆、c/c++
------------------------------------------------------------------------------------------------------
堆和栈的主要区别有以下几点:
------------------------------------------------------------------------------------------------------
1)管理方式和碎片问题
对于栈来讲,是由编译器自动管理,无须手工控制;对于堆来说,释放工作由程序员来控制,容易产生内存碎片;对于堆,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序的效率降低。对于栈来讲,则不会出现这样的问题,因为栈是先进后出的队列,不可能有一个非栈顶的内存块从栈中间弹出,在它弹出之前,它上面后进的栈内容已经被弹出,因此不会出现不连续的碎片。
------------------------------------------------------------------------------------------------------
2)分配效率
栈是系统提供的数据结构,计算机会在底层对栈提供支持,分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++提供的,它的机制相对复杂;例如分配一块内存,会按照一定的算法(内存分配算法)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的内存空间(可能由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低很多。
------------------------------------------------------------------------------------------------------
3)增长的方向不同
栈内存由一个栈指针esp来开辟和回收,栈内存是从高地址向低地址增长的,增长时,栈指针是向低地址方向移动,指针的地址值也就相应的减小;回收时,栈指针向高地址方向移动,地址值也就增加。所以栈内存的开辟与回收都只是指针的加减。
对于堆来讲,增长的方向是向上的,也就是向着内存高地址的方向移动;回收时,指针向低地址方向移动,地址值也就减小。
------------------------------------------------------------------------------------------------------
4)空间大小不同
一般来讲32位的系统下,堆内存可以达到4GB的空间,从这个角度来看堆内存几乎是没什么限制的。但是对于栈来讲,一般都有一定的空间大小。无论是堆还是栈,都要防止越界现象的发生,因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生意想不到的结果。
------------------------------------------------------------------------------------------------------
本文出自 “无名小卒” 博客,请务必保留此出处http://814193594.blog.51cto.com/10729329/1732670
标签:栈、堆、c/c++
原文地址:http://814193594.blog.51cto.com/10729329/1732670