堆和栈的区别
来源:互联网 发布:sql2005恢复数据库 编辑:程序博客网 时间:2024/06/08 23:39
关于堆和栈的区别讨论,分为两种情况
(1)数据结构中的堆和栈
(2)内存分配中的堆和栈
1.内存分配中的堆和栈的作用总结:
- 栈为函数内部声明局部变量提供存储空间,自动变量
- 进行函数调用时,过程活动记录存放于栈中
- 通过malloc在堆中分配空间,该空间在调用函数结束之后仍有效
2.堆和栈的区别总结:
- 栈是由编译器在程序运行时分配的空间,由操作系统维护
- 堆是由malloc()函数分配的内存块,内存的管理由程序员手动控制,在C语言使用free()函数完成.主要区别有一下几点:
(1)管理方式不同
- 程序在运行时栈由操作系统自动管理,无须程序员手工控制;由编译器进行分配和释放
- 堆空间的申请、释放工作由程序员控制,容易产生内存泄露.malloc/free进程操作
- 栈是向低地址扩展,是一块连续的内存区域.即栈顶的地址和栈的最大容量是系统预先规定好的,当申请的空间超过栈的剩余空间时,将出现栈溢出错误.
- 堆是向高地址扩展,是不连续的内存区域.因为系统是用链表来存储空闲内存地址的,且链表的遍历方向是由低地址高地址.
(3)产生碎片不同
- 对于堆来说,频繁的malloc/free势必会造成内存空间的不连续从而造成大量的碎片,使程序效率降低.
- 对于栈来说,一定是连续的物理内存空间.
- 在X86平台上,堆的增长方向是向上,即向着内存地址增加的方向;
- 栈的增长方向是向下的,即向着内存地址减小的方向.
- 栈是系统提供的,操作系统会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都是专门的指令执行.
- 堆则是C函数库提供的,它的机制很复杂,例如为了分配一块内存,则需要操作系统重新整理内存,搜索整理内存空间,这样就有机会分到足够大小的内存,然后返回.显然,堆的效率比栈要低的多.
0 0
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- 堆和栈的区别
- Android开发自学笔记(Android Studio1.3.1)—1.环境搭建
- 整理一下今天的收获(getSharePreferences的使用,解决在非onCreate方法中无法使用的情况)
- Bluetooth协议栈
- 纯 AS3 将图片转换为 SWF(转自同行“古树悬叶”的博客)
- 实现一个EditText中间有字,字两边都可点击触发事件的效果
- 堆和栈的区别
- Android Https相关完全解析 当OkHttp遇到Https
- Android 打开资源raw文件
- 工作中用到的Web技术
- 求公共前缀长度与所选字符串个数的乘积的最大值 Trie树求最值 UVA 11488 Hyper Prefix Sets
- 前端优化(压缩,位置)
- Chrome插件开发 – 浏览器交互
- Swift 面向协议编程
- 链表的排序与删除