内存堆与栈

  1. 数据结构
  • 堆:存取任意
  • 栈:先进后出
  1. 程序一般放在Rom(只读内存)中,运行时拷贝到内存RAM(随机存储器)
  • 栈区:相对较高的地址,栈地址向下增长
  • 堆区:向上增加,给程序员分配的内存空间
  1. 申请方式和回收方式
  • 栈:系统自动分配空间,函数运行的过程中,之后会被释放掉。
  • 堆:程序员自己申请的空间,malloc。堆上的空间只要程序员不释放,就一直可以访问到。但是忘记释放,就会造成内存泄漏。
  1. 申请后系统响应
  • 栈:栈的剩余空间不足,报异常栈溢出
  • 堆:操作系统有记录空闲内存地址的链表,会找第一个空间大于申请空间的堆节点,然后把该节点删除,空间分给程序,代码的delete会释放空间。没有用掉的系统的空间会继续重新放入空闲链表。
  1. 申请效率
  • 栈:比较快,系统分配
  • 堆:new出来的,容易产生内存碎片
  1. 申请大小的限制
  • 栈:windows系统栈是向低地址扩展,连续的内存区域,栈顶的地址和最大容量系统预先设置好了。windows下,栈的大小是2M(编译的时候可以设置);申请的空间超过栈的剩余空间,提示overflow。
  • 堆:向高地址扩展,不连续的内存区域(指针实现),链表遍历是从低地址到高地址。堆的大小受限于计算机系统中有效的虚拟内存。
  1. 存储的内容
  • 栈:主函数中函数调用后的下一条指令的地址,然后是函数的各个参数。大部分C编译器,参数从右到左边,函数中的局部变量入栈,静态变量不入栈~
  • 堆:头部用一个字节放堆的大小
  1. 存取效率
char s1[] = "aa"; 
char *s2 = "bb"; 
  • s1是运行时赋值(栈上的数组比指针指向的字符串存取快)
  • s2是编译时确定,堆
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值