Где.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каждый полностью определенный тип все равно будет иметь свой экземпляр статического значения.

Другие вопросы по тегам