c#对象的内存分配
假如有一下代码classCustomClass{inta=0;intb;publicvoidAdd(){this.a++;}}CustomClassCC1=newCust...
假如有一下代码
class CustomClass{
int a=0;
int b;
public void Add(){
this.a++;
}
}
CustomClass CC1=new CustomClass;
类类型是引用类型。CustomClass CC1会在堆栈中开辟一个4字节的内存,存储一个指向堆中CustomClass实例的指针,而实例中包含有int值类型,他是存储在堆栈中的!那问题来了,既然堆中开辟出了CustomClass实例所占用的内存大小,但int是在堆栈中的,是什么联系这个实例 和 这个实例在堆栈中的int a=0的(难道是堆中一个4字节指针反指向堆栈中的int a=0?堆中不是只存储值吗)!还有Add方法在内存中是怎么存在的!望高手回答,死活想不明白 展开
class CustomClass{
int a=0;
int b;
public void Add(){
this.a++;
}
}
CustomClass CC1=new CustomClass;
类类型是引用类型。CustomClass CC1会在堆栈中开辟一个4字节的内存,存储一个指向堆中CustomClass实例的指针,而实例中包含有int值类型,他是存储在堆栈中的!那问题来了,既然堆中开辟出了CustomClass实例所占用的内存大小,但int是在堆栈中的,是什么联系这个实例 和 这个实例在堆栈中的int a=0的(难道是堆中一个4字节指针反指向堆栈中的int a=0?堆中不是只存储值吗)!还有Add方法在内存中是怎么存在的!望高手回答,死活想不明白 展开
展开全部
1)程序在内存中映像包含5个部分:栈、堆、全局静态区、文本常量区和代码区。
2)对象实例化后,确切地说是实例中的数据成员保留在推中;实例的方法(代码)保存在代码段区中,实例的代码和数据成员肯定是分开存放。
回到你的问题:
1)成员变量 int 存放在堆中,不是栈中
2)void Add()肯定在代码区。在代码区的void Add()通过this找到堆中的实例。
2)对象实例化后,确切地说是实例中的数据成员保留在推中;实例的方法(代码)保存在代码段区中,实例的代码和数据成员肯定是分开存放。
回到你的问题:
1)成员变量 int 存放在堆中,不是栈中
2)void Add()肯定在代码区。在代码区的void Add()通过this找到堆中的实例。
更多追问追答
追问
即意:对象所有的类型成员是在堆中的,不论是值类型还是引用类型?所有的方法是在代码区存储的!对象通过映射来调用代码区的方法来处理堆中的类型成员!那么什么时候值类型是单独存储在堆栈中的?
追答
是的。例如
class A{……}
class B
{
A a = new A(); //一个引用类型数据成员
……
public void M1(int x, int y)
{
int r = x+y;
……
}
}
程序中 B b = new B()后,成员 a 仍然在堆中,只不过a是一个引用(指针),引用了(指向)在堆中的A的实例。
--------
在调用方法时,方法的参数、方法内部的值变量,都是在堆栈里的。如上面M1方法参数 x, y
以及方法内的值类型变量 r都在栈里。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询