Chinaunix首页 | 论坛 | 博客
  • 博客访问: 266751
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: Java

2015-06-02 10:56:24

java中,引用在栈中,申明时,引用不占内存,实例化赋值时,引用才占空间。基本数据类型在栈中OBJECT数据类型在堆中
C++中,指针变量在栈中,直接声明的变量在栈中new操作分配的对象在堆中。 
具体的:
 先来看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++中还有一个引用的概念,他的意思是别名,她是独立的一个概念,不占内存空间,只是一个别名和初始化时的变量绑定,操作别名即操作初始化时所绑定的变量。 
阅读(1742) | 评论(0) | 转发(0) |
0

上一篇:关键路径

下一篇:(int)a and (int&)a

给主人留下些什么吧!~~