[英]Where does .Net store the values of the static fields of generic types?
以下代碼允許我為每個類型T
存儲一個值:
public static class MyDict<T> {
public static T Value;
}
我可以存儲盡可能多的值,並且編譯器之前不知道我要使用的類型。 這些靜態字段值的存儲方式和位置在哪里?
更新 :顯然它存儲在內存中,但我想知道這個內存。 是堆嗎? 它是一些特殊的CLR內存嗎? 怎么稱呼? 還有什么方式存儲?
更新2 :JITter為MyDict<T>
所有引用類型參數生成單個實現MyDict<__Canon>
MyDict<T>
。 然而,這些值是分開存儲的。 我猜每個類型參數仍然有一些per-type-argument結構,雖然thw vtable鏈接到JITted MyDict<__Canon>
,但字段是分開的。 我對嗎?
這些靜態字段值的存儲方式和位置在哪里?
它們存儲在CLR選擇的位置的存儲器中。
顯然它存儲在內存中,但我想知道這個內存。
我出於好奇而假設。 如果你根據這個問題的答案做出編程決定那么你做錯了。
是堆嗎?
好吧,它不是堆棧或寄存器,這是肯定的。
它是一些特殊的CLR內存嗎?
是的。
這叫什么?
高頻堆。
還有什么方式存儲?
虛函數表。 接口映射結構。 方法說明。 CLR認為可以經常訪問的任何其他內容,由CLR自行決定。 我們在此深入了解實施細節。
JITter為
MyDict<T>
所有引用類型參數生成單個實現MyDict<__Canon>
MyDict<T>
。
正確,雖然這是一個實現細節。
然而,這些值是分開存儲的。
“值”是指“每個構造類型的靜態字段的值”。 是。
我想每個類型參數仍然有一些per-type-argument結構
是的,數據必須到達某個地方!
vtable鏈接到JITted
MyDict<__Canon>
,字段是分開的。
我不明白這句話是什么意思,所以我無法證實或否認其正確性。
我也想知道是否有辦法像這樣擁有每個對象的商店。 即不是泛型類型+ T,而是對象+ T.
為了澄清,您的問題是: 有一些存儲機制將泛型類型C<T>
和給定構造C<Foo>
與給定的C<Foo>
靜態字段相關聯。 我們可以將其視為查找,其中“key”是元組( C<T>
, Foo
, field
),值是字段的值。 是否有類似的存儲機制,其中鍵是( C<T>
, some arbitrary object
, field
)?
不,如果您需要,請自行構建。
MyDict<T>
不是完全定義的類型。 每個完全定義的MyDict<T>
類型都有自己唯一的Value實例(例如MyDict<string>
, MyDict<object>
和MyDict<int>
可以具有唯一的Value
)。
此外,這並不特殊,因為Value
的類型是T
,即使Value
的類型是DateTime
,每個完全定義的類型仍然有自己的靜態值實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.