堆与栈的对比


堆栈的对比



一、管理方式

栈:由编译器自动管理的,无需手工控制;

堆:是否工作由程序猿控制,易产生memory Leak。


二、申请大小

栈:在windows下,栈的大小为2M,它是向低地址扩展的数据结构。意思是栈顶上的地址和栈的最大容量是系统预先约定好的,如果申请的空间超过了栈的剩余空间就会overflow;

堆:它是向上扩展的数据结构,是不连续的内存区域,这是由于系统是用链表来存储空闲内存地址的。堆的大小受限于系统的有效虚拟内存,由此可见堆内存获取的空间比较灵活,也比较大。


三、碎片问题

栈:它是先进后出的队列,如此的一一对应,以至于永远都不可能有一个从栈中弹出,故不存在碎片问题;

堆:频繁地NEW/DELETE,势必会造成内存空间的不连续,从而造成大量的碎片,使得程序效率降低。


四、分配方式

栈:静态分配和动态分配。静态分配是编译器完成的,如局部变量的分配;动态分配是由alloc函数进行分配的,与堆的动态分配不同的是,栈的动态分配由编译器进行释放,无需使我们手工实现。

堆:动态分配。


五、分配效率

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

堆:它是C/C++函数库提供的,机制较为复杂。




小结:

内存的基本构成:静态存储区、堆区和栈区

1、静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。他主要用于存放静态数据,全局数据和常量。


2、堆区:程序在运行时用malloc或new申请任意大小的内存,程序猿自己负责在适当的时候用free或delete释放内存。动态内存的生命周期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。良好的编程习惯是:如果某动态内存不再使用,就及时将其释放掉,否则我们将认为发生了内存泄露。

3、栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上面创建,函数执行结束时这些存储单元会被自动释放。栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限。



参考:

http://baike.baidu.com/link?url=bBGUCDMYxAVMp14lZQhLIqiHbTTJCE5ldcCSfDBxZFXKloEeT0YIXfvmwW6H6u_himJ0eAfDUgKycYl2foUHX_

http://blog.csdn.net/eagle_of_sky/article/details/5948889

http://www.jb51.net/article/37563.htm

你可能感兴趣的:(iOS学习,堆,栈,堆栈的对比)