c++和java的内存分配到底是怎么回事
今天遇到了这个问题,想搞的彻底些,查了些资料,还不太完善,望指教。
在c++中
栈中存放的是局部变量,函数的形参等东西,是程序自动为我们分配的,类似数据结构中的栈,先进后出
堆中存放的是new出来的东西,内存的申请与释放需要程序员手动完成,类似于数据结构中的链表
struct Student
{
int num;
char name[10];
};
Student *stu = new Student;
那么stu被分配在了栈中,而堆中则分配了4+10个字节吧,stu指向这个内存的首地址。
Student stu;在这句话中stu被分配在了栈中,那么他占据多少内存呢,是4+10个?还是语法错误,因为没有初始化?
自由存储区存放malloc分配的内存,是c语言中的用法,类似于堆。
静态区存放static申明的变量,不论是局部的或是全局的,不能用extern关键字来申明为其他区域。
常量区存放const申明的常量,给数据不可以改变。
在java中
同样是这些东西
Student stu=new Student;
stu存放在栈中,new出来的东西存放在堆中,stu这个引用指向了student。这些东西不必程序员去手动释放。
其他东西的存放类似于c++;
那么Student stu;
是否也是错误呢?
------解决方案--------------------你可以看做Java中的Student stu就是c++中的Student *stu,java中不存在c++中的Student stu这种东西
------解决方案--------------------Java里:Student stu; 就相当于C++定义了一个指针Student *stu;
这个时候还没有生成对象,必须手动的去new才行。
不过说回来,Java里内存是不用自己管理了,但是却会需要更多内存,不像C++用delete的时候,保证了内存能即时的回收。
------解决方案--------------------
不是4+10,而是4+12,内存对齐。
Student stu;声明了一个Student类型的变量,它占据的内存也是4+12。没有语法错误,可以先声明,然后初始化。
在java里面Student是一个类。
stu是Student类型的引用,初始化就是将实例化的Student对象(或派生类的对象)付给这个引用stu。
------解决方案--------------------
c++ 中 Student stu; 应该是分配在了栈 属于值类型 等同于 int double
java中 Student stu;是引用 底层来说的话应该就是一个指针
------解决方案--------------------顶,楼上说的都挺好。
C++中,Student stu;在这句话如果在一个函数中出现,则stu对象分配在栈上,由于内存对齐的原因,一般占据4+12个字节,stu中的元素没有被初始化,所以除了用来赋值其他的用法都是不正确的。
java 中 Student stu;如果出现在一个方法中,编译器强制要求进行初始化,stu是个引用类型,真正的对象在堆中分配。
C++中所有对象都有值语义,java中不是基本数据类型才有引用语义。