Chinaunix首页 | 论坛 | 博客
  • 博客访问: 475008
  • 博文数量: 93
  • 博客积分: 5006
  • 博客等级: 上校
  • 技术积分: 1002
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-30 13:58
文章分类

全部博文(93)

文章存档

2012年(2)

2011年(68)

2010年(23)

分类: C/C++

2011-03-23 17:12:42

以前都不了解程序占用的内存区5种 
(1) 全局/静态数据区
(2) 常量数据区
(3) 代码区
(4)栈
(5)堆
 
下面主要说说堆和栈的区别:
一、大小
栈一般为1MB(默认值),所以像  char buf[1024*1024]; 这样的定义通常会出错,因为栈溢出了。
堆只受限于系统有效的虚拟内存的大小。
二、效率
栈上的内存是系统自动分配的,压栈和出战都有相应的指令操作,因此效率高,并且分配的内存空间是连续的,不会产生碎片,而堆上的内存是由开发人员动态分配和回收的。栈上不存在内泄漏问题
当开发人员用new或者malloc声请内存时,系统要按算法在堆空间中找大小合适的空闲堆并修改相应的堆空闲空间的链表(读者可以自己编写一个内存分配的小程序自己亲身感受一下使用算法分配空闲堆),然后返回地址给程序,因此效率比栈低,此外,还容易产生内存碎片。堆上存在内存泄漏的问题
 
 
不知道你是否会有一个这么疑惑,既然堆影响效率,还产生内存碎片,为什么不扩加栈空间,而禁止堆的使用,我看到着的时候就有这么一个疑问,恕在下无知!
 
这有一个解释是:使用堆是因为要动态的管理数据(例如链表),栈的大小有限制,占用内存较多的对象或数据只能分配在堆上。
但我觉得
使用堆还有一个很好的因素是因为堆远比栈灵活,在很多时候使用恰当,可以节约空间资源。
阅读(2006) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

shell_way2011-03-26 12:54:03

话说貌似程序分为text bss data(rodata rwdata)等段,那个全局/静态数据就在data。。stack 中是局部的 。bss 是未初始化的。heap 是malloc 的。。
另外不能说栈的大小是多少,只能说每个程序被限使用多少貌似,用ulimit 指令修改下栈就大了么。。话说为什么不取消堆,是出于成本的考虑吧,另外栈也可以弄链表呀。。
另外我记得malloc 貌似不是这个样子,貌似是系统先调用brk() 分配大段,然后用malloc 分成小段返回的,如果brk 的被用完要再用brk 分配,好像不是直接用malloc 分配的。。。好久没写代码都忘光光了。。