以下代码允许我为每种类型存储一个值T:
public static class MyDict<T> {
public static T Value;
}
Run Code Online (Sandbox Code Playgroud)
我可以存储尽可能多的值,并且编译器之前不知道我要使用的类型.这些静态字段值的存储方式和位置在哪里?
更新:显然它存储在内存中,但我想知道这个内存.是堆吗?它是一些特殊的CLR内存吗?怎么称呼?还有什么方式存储?
更新2:JITter MyDict<__Canon>为所有引用类型参数生成单个实现MyDict<T>.然而,这些值是分开存储的.我猜每个类型参数仍然有一些per-type-argument结构,而当vtable链接到JITted时MyDict<__Canon>,字段是分开的.我对吗?
Eri*_*ert 15
这些静态字段值的存储方式和位置在哪里?
它们存储在CLR选择的位置的存储器中.
显然它存储在内存中,但我想知道这个内存.
我出于好奇而假设.如果你根据这个问题的答案做出编程决定那么你做错了.
是堆吗?
好吧,它不是堆栈或寄存器,这是肯定的.
它是一些特殊的CLR内存吗?
是的.
这叫什么?
高频堆.
还有什么方式存储?
虚函数表.接口映射结构.方法说明.CLR认为可以经常访问的任何其他内容,由CLR自行决定.我们在此深入了解实施细节.
JITter
MyDict<__Canon>为所有引用类型参数生成单个实现MyDict<T>.
正确,虽然这是一个实现细节.
然而,这些值是分开存储的.
"值"是指"每个构造类型的静态字段的值".是.
我想每个类型参数仍然有一些per-type-argument结构
是的,数据必须到达某个地方!
vtable链接到JITted
MyDict<__Canon>,字段是分开的.
我不明白这句话是什么意思,所以我无法证实或否认其正确性.
我也想知道是否有办法像这样拥有每个对象的商店.即不是泛型类型+ T,而是对象+ T.
为了澄清,你的问题是:有一些存储机制将泛型类型C<T>和给定构造C<Foo>与给定的静态字段相关联C<Foo>.我们可以认为这是一个查找其中的"重头戏"是元组(C<T>,Foo,field)和值的字段的值.是否有一个类似的存储机制,其中的关键是(C<T>,some arbitrary object,field)?
不,如果您需要,请自行构建.
MyDict<T>不是完全定义的类型.每个完全定义的类型MyDict<T>有一定的价值的自己独特的实例(例如MyDict<string>,MyDict<object>和MyDict<int>可以拥有的唯一值Value).
此外,这是不是因为特殊的类型Value是T,即使类型Value是DateTime,每个完全定义类型仍然有自己的静态值的实例.
| 归档时间: |
|
| 查看次数: |
1009 次 |
| 最近记录: |