程序设计中的堆和栈
2017-09-30 18:32
218 查看
参考函数调用的基本原理,就可以大概知道两者的不同,下面总结以下。
栈(stack)是为执行线程留出的内存空间(每一个线程都有一个栈)
当线程创建的时候,操作系统(OS)为每一个系统级(system-level)的线程分配栈。栈附属于线程,因此当线程结束时栈被回收。当线程被创建的时候,设置栈的大小。
特点:
跟踪栈简单
从栈中释放块(free block)只不过是指针的偏移而已
在栈上的每个字节频繁的被复用也就意味着它可能映射到处理器缓存中
大小有限
堆(heap)是为动态分配预留的内存空间(每一个应用程序通常只有一个堆尽管为不同类型分配内存使用多个堆的情况也是有的))
通常情况下,操作系统通过调用语言的运行时(runtime)去为应用程序分配堆。堆通常通过运行时在应用程序启动时被分配,当应用程序(进程)退出时被回收。在应用程序启动的时候,设置堆的大小,但是可以在需要的时候扩展(分配器向操作系统申请更多的内存)。
特点:
跟踪堆困难
和栈不一样,从堆上分配和重新分配块没有固定模式。因此,你可以在任何时候分配和释放它。这样使得跟踪哪部分堆已经被分配和被释放变的异常复杂;有许多定制的堆分配策略用来为不同的使用模式下调整堆的性能
在堆上的变量必须要手动释放,不存在作用域的问题
大量的分配和释放可造成内存碎片
可以分配较大的内存
栈(stack)是为执行线程留出的内存空间(每一个线程都有一个栈)
当线程创建的时候,操作系统(OS)为每一个系统级(system-level)的线程分配栈。栈附属于线程,因此当线程结束时栈被回收。当线程被创建的时候,设置栈的大小。
特点:
跟踪栈简单
从栈中释放块(free block)只不过是指针的偏移而已
在栈上的每个字节频繁的被复用也就意味着它可能映射到处理器缓存中
大小有限
堆(heap)是为动态分配预留的内存空间(每一个应用程序通常只有一个堆尽管为不同类型分配内存使用多个堆的情况也是有的))
通常情况下,操作系统通过调用语言的运行时(runtime)去为应用程序分配堆。堆通常通过运行时在应用程序启动时被分配,当应用程序(进程)退出时被回收。在应用程序启动的时候,设置堆的大小,但是可以在需要的时候扩展(分配器向操作系统申请更多的内存)。
特点:
跟踪堆困难
和栈不一样,从堆上分配和重新分配块没有固定模式。因此,你可以在任何时候分配和释放它。这样使得跟踪哪部分堆已经被分配和被释放变的异常复杂;有许多定制的堆分配策略用来为不同的使用模式下调整堆的性能
在堆上的变量必须要手动释放,不存在作用域的问题
大量的分配和释放可造成内存碎片
可以分配较大的内存
相关文章推荐
- 程序全球化设计资料
- CUDA程序优化心得之测时函数的设计
- 程序江湖:第九章 设计就是画类图?
- star.baidu.com程序设计大赛初赛、复赛题目
- 通过学习学生信息管理系统软件,C程序中,如何设计和编写一个应用系统
- 程序设计实训报告-小学生考试系统
- 中国象棋程序的设计与实现(七)--心得体会和开发日志
- C#中的泛型程序设计总结
- 2017-2018-1 20155214 《信息安全系统设计基础》实验三 并发程序
- 在Visual C++6.0中设计托盘图标程序
- 利用Java Swing技术设计一个鼠标点击速度比赛游戏程序。程序显示一个按钮和一个文本框,用户点击按钮,文本框显示鼠标点击次数。两个人同时运行本程序,即可进行比赛
- 亲密接触Java手机程序设计(一):认识手机程序运行环境――J2ME平台
- ACM_程序设计竞赛:贪心算法:硬币问题
- C02-程序设计基础提高班(C++)第8周上机任务-结构体
- "科林明伦杯"哈尔滨理工大学第六届程序设计团队赛(12.10)
- java 设计程序 如何把汉字转成 %B6%B7%C6%C6%B2%D4%F1%B7
- 【原创 Hadoop&Spark 动手实践 10】Spark SQL 程序设计基础与动手实践(下)
- 嵌入式Linux webserver: Boa+CGI程序设计技术[转]
- 京麦微信小程序圣诞抽奖项目的架构设计
- WPF程序设计指南: The Application and the Window