首页 新闻 会员 周边 捐助

值类型方法在内存中如何存放,值类型的方法放在哪

0
悬赏园豆:30 [待解决问题]

比如引用类型,分配在托管堆上。首先会创建一个类型对象,实例对象会有类型对象指针成员指向类型对象。那么值类型的实例一般会分配在堆栈上。

1.值类型的实例对应的类型对象在哪创建?

2.值类型的方法(方法表)在哪个地方?

3.值类型装箱之后在托管堆中生成的引用类型的实例类型对象指针指向何处?

问题补充:

4.值类型中可以使用引用类型的字段吗?如果可以,内存怎么分配?

 

不好意思忘说了。[.net 、 CLR、C#]

tc庄稼汉的主页 tc庄稼汉 | 初学一级 | 园豆:172
提问于:2013-12-24 11:47
< >
分享
所有回答(4)
0

楼主说的是Java吧,说说我的理解,楼主主要问题是创建了N多模糊的概念,引用类型,类型对象,类型对象指针成员,实例对象。。。我大概明白是什么意思,但是描述的不够准确。实际上Java中数据只有两种类型:基本类型,引用类型。不管是哪个类型,使用的时候是不是都是这样的,类型 变量 = new 类型(); 或者 类型 变量 = 123;等等。这里有两个概念:变量和值。变量应该也是存放在内存中某一区域,但是实际上可以先不用理会,先关心一下值在内存中是如何存放的。对于基本类型的数据,其变量对应的值是直接存放在栈中的,如果是引用类型的数据,其变量对应的数据也是存放在栈中的,不过区别很明显,基本类型的值就是数字啊,bool啊,都是些直接量。引用类型存放在栈中的是一个地址。该地址指向堆中某一区域的起始地址。那一片区域存放这个对象:包括该对象的成员变量和成员方法。理解到这里基本就OK了,不过楼主可能会关心如果对象的成员变量还是一个引用类型对象,那在堆中是怎么存放的呢。。。我也不太清楚了,呵呵。不过那个成员变量是一个引用类型,必然有一个变量存放着一个地址在栈中。记住一点就行了,变量存放着一个地址在栈中,该地址指向堆中某一区域的起始地址。还有一点,编译器是可以理解基本类型和引用类型的,所以不会把栈中的引用类型的地址当成一个基本类型的数值。

申明一下,实际上Java的内存概念非常复杂,不是一两句话就能说的明明白白的。可以参考:http://www.infoq.com/cn/articles/java-memory-model-1

ThreeTree | 园豆:1490 (小虾三级) | 2013-12-24 12:29

先谢谢啦!忘了说是.Net了  

支持(0) 反对(0) tc庄稼汉 | 园豆:172 (初学一级) | 2013-12-24 12:34

@tc庄稼汉: 晕,短短一句话就game over 了

支持(0) 反对(0) ThreeTree | 园豆:1490 (小虾三级) | 2013-12-24 12:45

一股蛋蛋的有伤!

 

支持(0) 反对(0) ✎﹏ℳ๓₯㎕ღ | 园豆:1499 (小虾三级) | 2013-12-24 13:13

@ThreeTree: 革命尚未成功,咱们接着继续

支持(0) 反对(0) tc庄稼汉 | 园豆:172 (初学一级) | 2013-12-24 17:28

@MrLenon: 蛋蛋的忧伤

支持(0) 反对(0) tc庄稼汉 | 园豆:172 (初学一级) | 2013-12-24 17:30
0

建议看看《clr via c#》这本书,先去看看这个http://www.cnblogs.com/qq0827/p/3281150.html

对值类型和引用类型有些了解之后,在去看看

http://www.microsoft.com/china/MSDN/library/netFramework/netframework/JITCompiler.mspx?mfr=true

秋壶冰月 | 园豆:5903 (大侠五级) | 2013-12-24 12:41
0

1. 文字描述不清楚...

值类型 分配在 栈上,包含其值及指针地址

2.值类型即结构Struct,它的 方法都是在方法表里(实例和静态方法),方法表又分配在 加载堆中。

3.装箱后,引用地址 赋给一个变量(堆栈上),不能就是空引用。

4.可以, 按照值类型和引用类型 的分配原则来就行,如果有引用类型,分配在托管堆中,值类型的变量中包含这个引用。

Qlin | 园豆:2403 (老鸟四级) | 2013-12-24 13:09

(图1)

1.如(图1),clr会在托管堆里利用元数据构建的一个可以描述类型本身的数据结构(类型对象),包含有静态字段、方法表等。请问:Int32、Double和自定义值类型会在托管堆生成一个这样的数据结构(类型对象)(类型对象是不是分配在loader heap上,实例对象分配在GC 堆上?)

2.值类型从堆栈上如果可以直接调用加载堆上的方法,是不是不需要“装箱”;而若是调用基类定义的方法,就需要进行“装箱”

 

支持(0) 反对(0) tc庄稼汉 | 园豆:172 (初学一级) | 2013-12-24 17:20
0

嗯,还是看看CLR Via C#吧,里面有非常详细的说明。

ocean | 园豆:824 (小虾三级) | 2013-12-24 14:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册