Stack和Heap的区别

1.stack:栈   heap:堆

2.空间分配问题:

   stack的空间是由操作系统自动分配和释放,存放函数的参数值,局部变量的值,操作方式类似于数据结构中的栈;

   heap:一般是程序员分配释放,空间是手动申请和释放的,heap常用new关键字来分配;

3.缓存方式的区别:

   栈使用的是一级缓存,通常都是被调用时处于存储空间中,调用完毕立即释放;

   堆是存放在二级缓存中,生命周期是由虚拟机的垃圾回收算法来决定的;

4.数据结构的区别:

      堆(数据结构):堆可以被看成是一颗树,如:堆排序

    栈(数据结构):一种先进后出的数据结构

5.举例:

           int a;//此时a在栈区

           object a=null;//只在栈内存中分配空间

           new 数据类型(); 或者malloc(长度);//定义的东西在堆区

           object b=new object();//则在堆内存中分配空间

6.堆主要是用来存放对象的,栈主要是用来执行程序的,这种主要是由堆和栈的特点决定的;

         (1).C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量都是从栈中分配内存的,注意:在分配的时候,

        比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,就是虽然分配是在程序运行时进行的,

       但是分配的大小多少是确定不变的,这个“大小多少”是在编译时就确定的,不是在运行时。

(2).堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,由于从操作系统管理的内存分配,

所以在分配和销毁时都要占用时间,因此用堆的效率非常低,但是堆的优点在于,编译器不必知道从堆里分配多少存储空间,也不必知道存储的

数据要在堆里停留多长时间,因此,用堆保存数据时会得到更大的灵活性,事实上,面向对象的多态性,堆内存分配是必不可少的,

因为多态变量所需的存储空间只有在运行时创建了对象后才能确定,C++中,创建一个对象,使用new即可,执行这些代码时,会在堆里自动

进行数据的保存,当然,这会花费更长时间,导致效率低。

7.其它区别:

堆是不同于栈的另一部分区域,系统会给每个程序分配一部分栈空间让他们能够运作起来,问题是栈空间必然存在不够用的问题,

而堆不属于程序,堆是独立的,是公用的,只要你mallic(sizeof(size),就可以得到相应一部分的堆空间。

8.一些问题:

    Q:有栈,为什么用堆?

    A: 堆里面的东西有生命周期,即变量作用域,你在函数内部创建一个变量,函数调用结束这个变量就没了,而堆里面的东西独立于你的程序,

          malloc()后,除非free()掉,否则一直存在。

     Q: 为什么用堆少?

     A:麻烦

     Q:有什么需要注意的?

      A:堆里面申请的东西,是随机分配的,不像栈里面的地址都已经计算出来了,所以申请了堆空间之后一定要创建一个指针保存你所

          申请的堆空间的地址,不然就找不到你申请的空间了。

         既然涉及到指针,请注意用之前检查一下指针是否为空的问题。

        堆空间的东西申请好,在用完之后一定要free()掉,以防止堆溢出。


推荐网址:http://blog.chinaunix.net/uid-24958038-id-3132588.html

暂时就写这些了,未完待续...







         


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值