"obj所引用的实例中的变量x是存在于哪里的呢?"
on the managed heap
on the managed heap
解决方案 »
- Wince 多线程
- 如何历遍hashtable 把里面的值填充到listview
- C# toolStrip和toolStripPanel的问题?
- 水晶报表与DataSet关联问题!
- ajax 后台取前台select的值 大哥们帮下最好举个简单的例子
- 如何将字符串"1,2,3,4,5"转换成数组double[] abc={1,2,3,4,5}
- 为啥不通过哦
- 进程间的数据交互,怎么办?
- RMB找人反编译C#的程序(好象是MaxtoCode加密的)
- 如何设置openFileDialog的大小,不是显示后用鼠标来控制?
- 在调用webservice 的方法的时候,方法里的运算是否全在服务器端完成
- 值类型和引用类型在内存中的位置有什么区别?
关于这一点你可以详细查看<<C#高级编程>>的第三章!
该书到处都有下载!
首先,你的例子有一个语法看起来不太舒服,
j obj;obj = new j;
改为j obj;obj = new j(),我们的csc会更高兴些.首先,win32的管理内存空间是4GB,这4GB的空间称虚拟地址空间,简称虚拟内存,无论堆(heap)还是栈(stack),都在这里面.而我们的计算机一般没有这么大的内存,也不大可能用这么多的内存. 所以给他们做了一下划分,有一部分性能高的化出来,叫栈(stack),令一块叫堆(heap),性能低,但是能装的东西多.说说值类型是如何放在栈(stack)的.
int i; double d; 计算机会在栈顶开辟4个存储单元,放i(不如是100-103,当然,绝对不是100,仅仅比如,后面都这样),然后有拿了8个来放d;说说引用行的如何放在堆(heap)中的.
比如
class Class MyClass
{
int i;
double d;
}
MyClass myObj = new MyClass()
首先,windows要计算这个对象要占用的长度,比如,一个int 4 个字节,一个double要8个字节,还有一个要放这个对象多长,(一般是以32字节为最小分配单位),然后分配了一个32个字节的连续字节,比如是以1000开头.来放这个对象的内容. 虽然内容放好了,但是别人并不知道他在那儿,于是就要到栈(stack)上去,开4个字节(比如从160开始),来放这个100(堆(heap)的开始地址).以后有人使用myObj时候,先找160,然后找1000,就找到里面的内容了.由于的堆(heap)还是栈(stack)原理和速度不同,所以才有了不同的存储方式.比如栈(stack)后来的先走,要想回收前面声明的变量,必须要先回收后面声明的. 要是所有的东西都放在栈里,恐怕不一会就占满了栈的空间. 而堆(heap)就没有这个限制,随时可以回收不用的东西,大不了你的堆(heap)的开始地址先放在栈中.