`
plussai
  • 浏览: 88283 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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操作分配的对象在堆中。
分享到:
评论

相关推荐

    java 栈和堆,Java自动管理栈和堆

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    关于Java栈与堆的思考-

    栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    关于C++中栈指针和堆指针的使用说明

    带这个问题与本中心庄鹏飞老师讨论之后,发现原来我没有搞清楚在C++中指针分为栈指针和堆指针。参见int* Test::getArray()方法中关于数组的声明以及本人非常详细的说明,那么我想会给学习C++编程的人员带来收获。 ...

    java栈与堆1

    栈:函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除,这也是JAVA优于C++的表现

    java堆栈的区别 -- 详解

    堆和栈是两个不同的概念 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其...

    【零基础学算法】 超详细动画讲解支持 Java, C++, Python, Go, JS, TS, C#, Swift等语言)

    数组、链表、栈、队列、哈希表、树、堆、图等数据结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤...

    C++内存管理.doc

    1.1.1.3 堆和栈究竟有什么区别? 1.1.2 控制C++的内存分配 1.1.2.1 重载全局的new和delete操作符 1.1.2.2 为单个的类重载 new[ ]和delete[ ] 1.1.3 常见的内存错误及其对策 1.1.4 指针与数组的对比 1.1.4.1 修改内容...

    Java数据结构和算法中文第二版

    全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和队列、链表、递归、进阶排序、二叉树、红黑树、哈希表及图形等知识。附录中则提供了运行专题Applet和例程、相关书籍和问题解答。本书提供了学完一门编程...

    golang的gc回收针对堆还是栈?变量内存分配在堆还是栈?

    堆和栈的简单说明: 1.栈(操作系统):由操作系统自动分配释放 2.堆(操作系统): 一般由程序员分配释放,例如在c/c++中,在golang,java,python有自动的垃圾回收机制 我们都知道变量占有内存,内存在底层分配上...

    Java数据结构和算法中文第二版(1)

    它使用JAVA语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二...

    java基础入门教程

    通 过 颁发 许 可 证 的 办 法 来 允 许 各 家 公 司 把Java虚 拟 机 和 Java的Applets类库 嵌 入 他 们 开 发 的 操 作 系 统 ,这 样 各 类 开 发 人 员 就 能更 容易 地 选 择 多种 平 台 来 使 用 Java语 言 编 ...

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    这本经典、畅销的数据结构教材详细介绍了数据抽象的基础知识,强调作为面向对象方法基础原理的规范和实施之间的区别。...附录K 针对Java编程人员的C++知识 759 附录L 针对Python编程人员的C++知识 767

    Java堆外内存的使用

    事实上在C或者C++中,你只能使用未托管内存,因为它们默认是没有托管堆(managed heap)的。在Java中使用托管内存或者“堆”内存是这门语言的一个特性。注意:Java并非这么做的语言。  new Object() vs 对象池 vs ...

    Java虚拟机.docx

    3.本地方法栈:当Java去调用一些本地的C/C++方法时使用的栈,native关键字修饰的方法是间接去调用本地的底层方法。 4.堆:通过new关键字,创建对象都会使用到堆内存,堆属于线程共享的,需要考虑线程安全的问题,有...

    Java数据结构和算法(第二版)

    对于C++程序员的Java Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示...

    [java]读书笔记整理:一切都是对象

    用堆进行存储分配比用堆栈进行存储分配需要更多的时间(如果确实可以在java中向在C++中一样在栈中创建对象)。 4) 静态存储 这里的“静态”是指“在固定的位置”(尽管也在RAM里)。静态存储里存放程序运行时一直...

    Java数据结构和算法中文第二版(2)

    它使用JAVA语言说明重要的概念,而避免了C/C++语言的复杂性,以便集中精力论述数据结构和算法。 经验丰富的作者Robert Lafore先生提供了许多简单明了的例子,避免了对于这类命题常见的冗长、繁琐的数学证明。在第二...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    / 29 2.2.7 直接内存 / 29 2.3 对象访问 / 30 2.4 实战:OutOfMemoryError异常 / 32 2.4.1 Java堆溢出 / 32 2.4.2 虚拟机栈和本地方法栈溢出 / 35 2.4.3 运行时常量池溢出 / 38 2.4.4 方法区溢出 / 39 2.4.5...

    java数据结构与算法第二版

    对于C++程序员的Java Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么...

    JAVA面试题最全集

    堆和栈的区别 20.ejb的分类及区别 21.你对现在软件业以及国内软件业的看法 22.谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和swing组件的GUI设计的关键 27....

Global site tag (gtag.js) - Google Analytics