堆 栈 常量池 --C与JAVA对比 纯小白笔记

堆 栈 常量池 --C与JAVA对比 纯小白笔记

预备知识:
Q1.两个new string地址值会相等吗?
不会。是因为我们“new”一个对象的时候,内存会在堆里为它开劈一个新的内存空间。
链接:https://baijiahao.baidu.com/s?id=1616217269725946631&wfr=spider&for=pc。
JVM虚拟内存分布:在这里插入图片描述
上述图像若过于抽象,则通过买房子构建内存 堆栈 概念
知乎链接 https://www.jianshu.com/p/dbad2ec8b290

JAVA中:
栈:存放基础类型。byte short int long float double bool char
堆:存放引用类型。数组,类,接口,引用类型变量存在栈,对象存在堆,通过引用确定关系。
在这里插入图片描述
方法区:
常量池:
在这里插入图片描述
静态常量池:所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
动态常量池:由上图可以看出方法区内只含有运行时常量池。运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
C:
C++程序占用的内存总共分为5部分:栈区(局部变量)、堆区(malloc)、全局/静态存储区(全局变量、静态变量)、常量区(常量)和代码区(代码)。
栈:和java栈类似
常量区:和java常量池类似
堆:C语言中的堆是malloc赋值得来的
在这里插入图片描述
字符串是放在常量池的,字符串是不可以修改的所以和final修饰的常量一样,当你定义一个字符串的时候如String str = “nihao”; 他会先去常量池找有没有“nihao”,如果有就直接指向他,没有会在常量池中建一个。
数组在JAVA和C中存储方式不同
C语言:
malloc或new的数组存在堆中
不带static前缀的局部数组在栈中
带static前缀的局部数组和全局数组在全局数据区中
char s1[] = “hello1”;

char *s2 = “hello2”;

区别如下:

1)存储区域不同

s1、s2均存储在栈中;

"hello1"存储在栈中,因为它是一个字符串数组;

"hello2"存储在常量存储区;(和JAVA字符串相同)
JAVA
JAVA数组都是放在堆中。而字符串是放在常量池的,字符串是不可以修改的所以和final修饰的常量一样,当你定义一个字符串的时候如String str = “nihao”; 他会先去常量池找有没有“nihao”,如果有就直接指向他,没有会在常量池中建一个。

发布了14 篇原创文章 · 获赞 0 · 访问量 146

猜你喜欢

转载自blog.csdn.net/sheep1998/article/details/103372943
今日推荐