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