Где именно does.Net хранить значения статических полей универсальных типов?


Следующий код позволяет мне хранить значение для каждого типа T:

public static class MyDict<T> {
    public static T Value;
}

Я могу хранить столько значений, сколько существует типов, и компилятор не знает заранее, какие типы я собираюсь использовать. Как и где хранятся эти статические значения полей?

Обновление : Очевидно, он хранится в памяти, но я хочу знать об этой памяти. Это куча? Это какая-то особая память CLR? Как это называется? Что еще хранится таким образом?

Обновление 2 : дрожание генерирует единственную реализацию MyDict<__Canon> для всех аргументов ссылочного типа MyDict<T>. Тем не менее, значения хранятся отдельно. Я предполагаю, что все еще существует некоторая структура аргументов для каждого типа аргумента, и хотя thw vtable связан с JITted MyDict<__Canon>, поля разделены. Разве я не прав?

2 10

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