堆与栈的对比
来源:互联网 发布:ubuntu chmod r 编辑:程序博客网 时间:2024/05/04 15:06
堆栈的对比
一、管理方式
栈:由编译器自动管理的,无需手工控制;
堆:是否工作由程序猿控制,易产生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
- 堆与栈的对比
- 堆和栈的对比
- 堆和栈的对比[转]
- 堆和栈的对比[转]
- 堆和栈对比
- 堆、栈对比分析
- asp.net堆和栈的对比 #1
- 堆与栈的区别
- 堆与栈的区别
- 堆与栈的区别
- 堆与栈的区别
- 堆与栈的区别
- 栈 与 堆 的区别
- 堆与栈的区别
- 栈与堆的区别
- 堆与栈的区别
- 堆与栈的区别
- 堆与栈的区别
- Objective-C运行时消息派发机制
- 浅析MVC模式与三层架构的区别
- 正则表达式
- 网页媒体播放利器 - JW Player使用心得
- js程序中美元符号$是什么
- 堆与栈的对比
- 数据结构:循环队列(C语言实现)
- Html5进度条插件(自写)
- JavaScript操作iframe之不得不说的秘密(一)
- iOS 支付 [支付宝、银联、微信]
- android 电源管理
- 控制器与dataSource
- Android 获取内存、内部存储、外部存储空间大小
- 蓝桥杯-- 历届试题 买不到的数目