值类型是否像引用类型一样保留Type指针、同步根和静态字段?
值类型是否像引用类型一样保留Type指针、同步根和静态字段?
值类型是否像引用类型一样保留“类型指针+同步根+静态字段”?这个问题是以下问题的扩展版本:do-value-types-have-type-objects。能否有人澄清一下:
- 值类型是否在CLR堆中存储了相关的System.Type对象?
- 如果没有关联的类型对象,值类型的静态字段和方法存储在哪里?
- 如果没有为值类型提供同步块,它们是否有同步根字段(值类型是否是线程安全的)?
Does a value type keep Type pointer + Sync root + Static fields like a reference type?
在上述内容中,我们可以看到这个问题的出现是因为有关值类型是否在CLR堆中存储相关的类型对象的疑问。文章提到了结构体没有与之关联的头部,也没有存储在其旁边的类型信息。但是,如果问的是System.Type,那么Type的元数据将会在堆中。但是它不会提前创建。
文章还提到了无论是值类型还是引用类型,静态字段都存储在一个特殊的堆中,称为“高频堆”,每个应用程序域都有一个。与“垃圾回收堆”不同,这个堆不会被垃圾回收。
此外,文章中还引用了Jon Skeet的观点,他提到了每个静态变量都存储在堆中,无论它是在引用类型还是值类型中声明的。不管创建了多少实例,总共只有一个槽位。(尽管不需要创建任何实例,这个槽位也会存在。)这个堆与正常的垃圾回收堆是分开的,称为“高频堆”,每个应用程序域都有一个。
对于值类型是否有同步根字段(如果没有同步根,值类型是否线程安全)的问题,文章没有明确的回答。但是提到了如果是指SyncBlock而不是Sync-Root,它与线程安全无关。
关于值类型静态方法是否也存储在“高频堆”中的问题,文章引用了Jon Skeet的观点,他提到了每个静态变量都存储在堆中,无论它是在引用类型还是值类型中声明的。不管创建了多少实例,总共只有一个槽位。(尽管不需要创建任何实例,这个槽位也会存在。)这个堆与正常的垃圾回收堆是分开的,称为“高频堆”,每个应用程序域都有一个。对于第二个问题,Type对象不包含方法,它只包含元数据。关于方法存储在哪里的问题,它是通过地址进行即时编译和执行的。
最后,文章提到了当一个结构体在堆栈中时,它只是原始字节,没有与之关联的类型。当这个结构体使用box指令进行装箱时,类型信息将与之关联。
我们可以得出结论:值类型不像引用类型一样保留类型指针、同步根和静态字段。静态字段存储在特殊的“高频堆”中,而值类型的方法是通过方法表进行管理的。