Где именно does.Net хранить значения статических полей универсальных типов?
Следующий код позволяет мне хранить значение для каждого типа T
:
public static class MyDict<T> {
public static T Value;
}
Я могу хранить столько значений, сколько существует типов, и компилятор не знает заранее, какие типы я собираюсь использовать. Как и где хранятся эти статические значения полей?
Обновление : Очевидно, он хранится в памяти, но я хочу знать об этой памяти. Это куча? Это какая-то особая память CLR? Как это называется? Что еще хранится таким образом?
Обновление 2 :
дрожание генерирует единственную реализацию MyDict<__Canon>
для всех аргументов ссылочного типа MyDict<T>
. Тем не менее, значения хранятся отдельно. Я предполагаю, что все еще существует некоторая структура аргументов для каждого типа аргумента, и хотя thw vtable связан с JITted MyDict<__Canon>
, поля разделены. Разве я не прав?
2 ответа:
Как и где хранятся эти статические значения полей?
Они хранятся в памяти в месте, выбранном CLR.
Очевидно, что он хранится в памяти, но я хочу знать об этой памяти.Я исхожу из любопытства. Если вы принимаете программное решение, основанное на ответе на этот вопрос, то вы делаете что-то неправильно.
Это куча?
Ну, это не стек или регистры, это уж точно.
Это какая-то особая память CLR?
Ага.
Как это называется?
Высокочастотная куча.
Что еще хранится таким образом?
Vtables. Структуры карт интерфейса. Описание метода. И все остальное, что, по мнению CLR, будет доступно часто, по собственному усмотрению CLR. Здесь мы глубоко погружены в детали реализации.
Дрожание генерирует единственную реализацию
MyDict<__Canon>
для всех аргументов ссылочного типаMyDict<T>
.Правильно, хотя это деталь реализации.
Тем не менее, значения хранятся отдельно.
Под " значениями "вы подразумеваете" значения статических полей каждого построенного типа". Да.
Я предполагаю, что все еще существует некоторая структура аргументов каждого типа для каждого аргумента типа
Да, данные должны куда-то идти!
Я не понимаю, что означает это предложение, поэтому я не могу подтвердить или опровергнуть его правильность.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
, Каждый полностью определенный тип все равно будет иметь свой собственный экземпляр статического значения.