java,C++栈和堆

额,看惯了java,最近看c++就是蛋疼。。。写一篇日志比较一下java和c++建立变量时的内存模型。
先来看java,由于java中没有指针(*p),代替指针(*p)功能的是常说的名词引用(这里的引用和C++中又完全不同。。),java中的引用类似与指针的功能,它存放的是所指向的变量值的地址。比如int a=5; animal an=new animal();引用a和an存放的是所指向的变量的地址,引用的值通常存放在栈内存中。关于java引用和c++指针得区别,请参考前辈的文章http://skyriver123.iteye.com/blog/690905。回到正题,在java创建变量时,涉及到基本类型变量和object类型变量的区别。所谓基本类型boolean,int(4),float,
double(8),byte(1),long(8),short(2),char(1)就是基本的存储单元,在编译时,编译器会在栈内存中分配相应的空间,注意是栈内存。还有一种就是object类型的变量,他们在创建时,变量的引用(地址)存放在栈内存中,变量的具体信息,存放在堆内存中。当回收内存的时候,由于栈内存的生命周期由编译器决定,所以在变量生命周期结束时,变量自动消亡。而堆内存中的变量是由java垃圾回收器自动回收。在函数传值时,当我们对基本数据类型进行传值时,传递的是变量的值,对OBJECT类型传值时,传递的是变量引用。具体的关于栈和堆的区别请参考前辈的文章:http://liufei-fir.iteye.com/blog/699509
再来看c++,和java不同的是他拥有强大的指针功能使得我们能够对内存自由的操作。然而C++中的内存模型也分为STACK和HEAP。那么什么类型的变量存在栈中,什么类型的变量存在堆中呢?经过我的总结,简单的说,直接申明的变量存在栈中,由指针通过new命令分配内存的变量存放在堆中。int a=5,栈中;int *a;a=new int[4],堆中。栈中的内存和java 一样,生命周期结束就消亡,堆中的内存比较悲剧,没有像java一样的垃圾回收及可以回收,只能由delete命令人工回收(这也是C++内存分配灵活性的体现)。有关于具体的c++栈和堆的总结,请参考前辈的文章:http://www.programfan.com/blog/article.asp?id=27508。在C++中还有一个引用的概念,他的意思是别名,她是独立的一个概念,不占内存空间,只是一个别名和初始化时的变量绑定,操作别名即操作初始化时所绑定的变量。
到此为止,JAVA和C++的变量内存模型就分析的差不多了,总结一下,java中,引用在栈中,申明时,引用不占内存,实例化赋值时,引用才占空间。基本数据类型在栈中,OBJECT数据类型在堆中。C++中,指针变量在栈中,直接声明的变量在栈中,new操作分配的对象在堆中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值