栈和堆

  栈区(stack):由编译器自动分配和释放,用于保存局部变量、返回地址、函数的实参以及上下文。操作方法类似于数据结构中的栈;

  堆区(heap):一般有用户(即程序员)分配和释放。常用于用户、临时内存分配,用完归还系统。

  堆和栈都属于动态存储区,区别于全局变量、常量的静态存储区。下面对堆和栈的区别进行如下说明:

1.管理方式

  栈:由编译器管理;

  堆:由用户管理;

2.生长方向

  栈:向下。即向着低地址扩展;

  堆:向上。即向着高地址扩展;

3. 碎片问题

  栈:连续的内存区域,不会产生碎片。栈顶地址和栈的最大容量是系统预先规定好的。

  堆:不连续的内存区域,容易产生碎片。系统用链表来存储空间内存地址,链表的遍历方向由低地址向高地址遍历,关于此参考操作系统。

4. 空间大小

  栈:一般较小,大小固定,一般为1M;

  堆:一般比栈大,受限于计算机系统中有效的虚拟内存,32位系统下一般为4G。堆相对于栈,或得空间更灵活;

5. 分配方式

  栈:有静态分配和动态分配两种分配方式(区分前面讲的静态存储区和动态存储区)。静态分配由编译器完成;

  堆:只有动态分配,如 p1=(int *)malloc(10);

6. 分配效率

   栈:系统自动分配,用户无法控制,计算机在底层对栈提供支持,分配专门的寄存器存放栈地址,压栈和出栈都有专门的指令,故速度较快;

  堆:速度较慢。库函数按照一定的算法分配空闲空间(参考操作系统)。

推荐阅读:

Memroy Limits for Applicatins on Windows*

C dynamic memory allocation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值