堆和栈的区别

  1. 申请方式
    stack由系统自动分配,heap需要程序员自己申请,并指明大小
  2. 申请后系统的响应
    栈:只要剩余空间大于所申请的空间,系统就会为程序提供内存,否则就会报栈溢出;
    堆:系统有一个记录空闲内存地址的链表,当申请内存时,系统会遍历该链表,找到第一个空间大于所申请堆空间的结点,并将该结点从空闲结点表中删除,并将该结点的内存分配给程序。由于所找到的堆结点的大小不一定等于申请的内存大小 ,系统会将多余的内存重新放回空闲链表中。

  3. 申请大小限制
    栈:栈是向低地址扩展的内存结构,是一块连续的内存区域。意思是栈的大小有限制,获得空间较小。
    堆:堆是向高地址扩展的内存结构,是不连续的内存区域,这是由于系统是用链表来存储空闲内存地址的,自然是不连续的,堆的大小受限于计算机系统的虚拟内存,堆获得空间比较大

  4. 申请效率
    栈是系统分配的,效率较高但程序员无法控制
    堆是new分配的,一般速度较慢,而且容易产生碎片,但用起来最方便

  5. 栈和堆中存储内容
    栈:在函数调用时,第一个入栈的是主函数后的下一条指令的地址,然后是函数的各个参数,参数是从右往左入栈的,当函数调用结束后,局部变量先出栈,参数后出栈

  6. 存取效率
    char s1[] = “aaa”;
    char *p = “bbb”;
    aaa是在运行时赋值的,bbb是在编译时就确定的,但是在以后的读取中,在栈上的数组比指针所指向的字符串快;
    第一种在读取时就直接把字符串中的元素读到寄存器中;第二种则先把指针值读到edx中,再根据edx读取字符,显然慢了;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值