楼主说的是Java吧,说说我的理解,楼主主要问题是创建了N多模糊的概念,引用类型,类型对象,类型对象指针成员,实例对象。。。我大概明白是什么意思,但是描述的不够准确。实际上Java中数据只有两种类型:基本类型,引用类型。不管是哪个类型,使用的时候是不是都是这样的,类型 变量 = new 类型(); 或者 类型 变量 = 123;等等。这里有两个概念:变量和值。变量应该也是存放在内存中某一区域,但是实际上可以先不用理会,先关心一下值在内存中是如何存放的。对于基本类型的数据,其变量对应的值是直接存放在栈中的,如果是引用类型的数据,其变量对应的数据也是存放在栈中的,不过区别很明显,基本类型的值就是数字啊,bool啊,都是些直接量。引用类型存放在栈中的是一个地址。该地址指向堆中某一区域的起始地址。那一片区域存放这个对象:包括该对象的成员变量和成员方法。理解到这里基本就OK了,不过楼主可能会关心如果对象的成员变量还是一个引用类型对象,那在堆中是怎么存放的呢。。。我也不太清楚了,呵呵。不过那个成员变量是一个引用类型,必然有一个变量存放着一个地址在栈中。记住一点就行了,变量存放着一个地址在栈中,该地址指向堆中某一区域的起始地址。还有一点,编译器是可以理解基本类型和引用类型的,所以不会把栈中的引用类型的地址当成一个基本类型的数值。
申明一下,实际上Java的内存概念非常复杂,不是一两句话就能说的明明白白的。可以参考:http://www.infoq.com/cn/articles/java-memory-model-1
先谢谢啦!忘了说是.Net了
@tc庄稼汉: 晕,短短一句话就game over 了
一股蛋蛋的有伤!
@ThreeTree: 革命尚未成功,咱们接着继续
@MrLenon: 蛋蛋的忧伤
建议看看《clr via c#》这本书,先去看看这个http://www.cnblogs.com/qq0827/p/3281150.html
对值类型和引用类型有些了解之后,在去看看
http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true
1. 文字描述不清楚...
值类型 分配在 栈上,包含其值及指针地址
2.值类型即结构Struct,它的 方法都是在方法表里(实例和静态方法),方法表又分配在 加载堆中。
3.装箱后,引用地址 赋给一个变量(堆栈上),不能就是空引用。
4.可以, 按照值类型和引用类型 的分配原则来就行,如果有引用类型,分配在托管堆中,值类型的变量中包含这个引用。
(图1)
1.如(图1),clr会在托管堆里利用元数据构建的一个可以描述类型本身的数据结构(类型对象),包含有静态字段、方法表等。请问:Int32、Double和自定义值类型会在托管堆生成一个这样的数据结构(类型对象)(类型对象是不是分配在loader heap上,实例对象分配在GC 堆上?)
2.值类型从堆栈上如果可以直接调用加载堆上的方法,是不是不需要“装箱”;而若是调用基类定义的方法,就需要进行“装箱”
嗯,还是看看CLR Via C#吧,里面有非常详细的说明。