首页新闻找找看学习计划

引用类型和值类型

0
悬赏园豆:80 [已解决问题] 解决于 2019-01-07 18:05

引用类型在堆中都有一个类型对象存储静态字段和方法等信息,实例对象会有一个类型对象指针指向该类型对象。
问题:
值类型是否也有类型对象在堆中存储。
如果有的话,栈中的值类型变量是如果找到其相应的类型对象的。
如果没有的话,值类型的方法等信息存储在哪里的

关键字:类型对象
这个是CLR为程序创建的,用来存储静态字段和方法等信息的一个对象,我们定义的每个类,CLR都会创建相应的类型对象。
https://www.cnblogs.com/free722/archive/2011/06/19/2084278.html

海之殇的主页 海之殇 | 菜鸟二级 | 园豆:472
提问于:2019-01-04 13:25
< >
分享
最佳答案
0

当值类型实例化在栈上时,
1 是否也有类型对象在堆中存储:没有
2 如果没有的话,值类型的方法等信息存储在哪里的:元数据表中
(我看了下IL发现还是 call 指令调用实例方法,但这个时候堆中是没有类型对象,因为即便是虚方法也是非虚的调用虚方法,不需要查找类型对象信息来确定多态性,我是这样理解的,可能不对,如果错误请指正!!)

但是值类型的类型对象是会在运行时创建的,这个会发生在装箱,也就是值类型被用作引用类型使用时,其机制完全类同与引用类型的工作机制。

收获园豆:80
放逐人 | 小虾三级 |园豆:634 | 2019-01-07 16:10

编译时只是生成IL代码吧,只有运行时才把值类型变量压入栈中,所以感觉你说的不是很对
后面的装箱机制我也是明白的,就值类型方法调用的原理在《clr via c#》中没详细说清楚

海之殇 | 园豆:472 (菜鸟二级) | 2019-01-07 16:46

@海之殇: 编译时只是生成IL代码吧,只有运行时才把值类型变量压入栈中
这个我没有理解,
然后从一个侧面可以印证我的想法,值类型在栈上分配内存大小时,是不是只分配了变量本身所占的空间,没有分配类型对象指针和同步索引块,也就是说类型对象在这个地方没有用,既然没有用为什么还非得去创建个类型对象。

放逐人 | 园豆:634 (小虾三级) | 2019-01-07 16:52

@找点什么: 嗯嗯,这个还是比较赞同的,虽然还没完全弄懂,不过给了我个大概方向。

海之殇 | 园豆:472 (菜鸟二级) | 2019-01-07 18:04

@海之殇: 很抱歉 上面理解的不对!
我通过:https://archive.codeplex.com/?p=clrprofiler
发现值类型的类型对象存在于堆中,
“栈中的值类型变量是如果找到其相应的类型对象的” 我认为栈上的值类型不需要找到其类型对象。
其实我也有一个问题,如:int i=0; clr 怎么知道 i 地址是存储的是 int32的变量,或者说 CLR 不知道 i
是int32的变量。
我后面如果知道了,我再告诉你,或者你知道告诉我。

放逐人 | 园豆:634 (小虾三级) | 2019-01-08 19:30
其他回答(2)
0

如果一个引用类型包含一个值类型的变量,这个值类型也是存储在堆上。

fangq | 园豆:417 (菜鸟二级) | 2019-01-04 13:39

这个我知道,我意思是值类型的方法等信息是存放在哪的,是否也有对应的类型对象存储在堆中。

支持(0) 反对(0) 海之殇 | 园豆:472 (菜鸟二级) | 2019-01-04 13:41
0

对象一般是对应引用而言,比如我们说new 一个对象,而不会说new 一个值,所有可以说没有“值类型对象”一说。
为了防止一些造词,可以严格的说没有参照“引用类型对象”而言的“值类型对象。”

waiter | 园豆:1000 (小虾三级) | 2019-01-04 14:51

1、类型对象是用来存储类信息的对象,这个是clr为我们创建并存储在堆中的。在《clr via c#》一书中并没有指明是“引用类型对象”。我这里也没有说“值类型对象”,我问题里都是用书中说的“类型对象”

2、面向对象语言而言,万物都是对象,值类型也是有new方法的,int i=new Int32();

支持(0) 反对(0) 海之殇 | 园豆:472 (菜鸟二级) | 2019-01-04 16:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册