Luffy1
@Luffy1
Student, Junior .NET programmer, C#, JS, HTML/CSS

Где находится статический класс в памяти?

В какой памяти находится статический класс, в куче, по идее? Статический класс - это объект-тип, который содержит таблицу методов, но только статических и статического конструктора?
  • Вопрос задан
  • 402 просмотра
Решения вопроса 1
ayazer
@ayazer
Sr. Software Engineer
, но таблицы методов создаются под каждый объект класса индивидуально.

нет, вы что-то путаете. 1 таблица на каждый тип, нет смысла создавать копию под каждый объект. ну и теперь ответ на остальную часть вопроса становится очевиден - нет разницы между таблицей методов для статического/не статического класса - все лежит где-то в куче в AppDomain.

upd:
В какой памяти находится статический класс, в куче, по идее?
конечно, только не в той которая SOH/LOH, а в той что упоминается у рихтера как "на самом деле куч больше чем 2, но остальное вам не нужно". А если еще точнее - в high frequency heap. Не знаю зачем это знание вам надо, но живите теперь с этим.

Статический класс - это объект-тип, который содержит таблицу методов, но только статических и статического конструктора?

мех, на самом деле так себе формулировка. лучше остановится на том, что в контексте c# - статический объект это специальный случай объекта, который может содержать только статические поля/методы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Вспомнил, что читал про такое в книге "Оптимизация приложений на платформе .Net".


Таблица методов
Поле указателя на таблицу методов ссылается на внутреннюю структуру CLR под названием таблица методов (method table), которая в свою очередь ссылается на другую внутреннюю структуру под названием EEClass (где ЕЕ, это аббревиатура от Execution Engine - механизм выполнения). Вместе, таблица методов и EEClass, содержат информацию, необходимую для выбора виртуального метода, метода интерфейса, статической переменной, определения типа объекта во время выполнения, доступа к методам базового класса и многих других целей. Таблица методов содержит часто используемую информацию, требуемую для выполнения операций такими механизмами, как механизм выбора виртуального метода, а структура EEClass содержит информацию, используемую реже, например, механизмом рефлексии. Ознакомиться с содержимым обеих структур данных можно с помощью команд !DumpMT и !DumpClass библиотеки SOS.

Массив ссылок на статические поля фиксируется так, что его адрес не может быть изменен сборщиком мусора, кроме того, статические поля простых типов размещаются внутри таблицы методов, которая не затрагивается сборщиком мусора. Это гарантирует, что для доступа к таким полям можно без опаски использовать жест­ко зашитые адреса.


Есть таблицы, где вся информация хранится.
В windbg можно посмотреть подробней.

Пример класса:
class MyClass
{
    private string _field1 = "Some string 1";
    public string Field2 { get; set; }
}

0:003> !do 0000005400006600
Name:        ConsoleApplication1.MyClass
MethodTable: 00007ffa2b5c4378
EEClass:     00007ffa2b6d2548
Size:        32(0x20) bytes
File:        E:\...\ConsoleApplication1.exe
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007ffa89d60e08  4000002        8        System.String  0 instance 0000005400006620 _field1
00007ffa89d60e08  4000003       10        System.String  0 instance 00000054000035a0 <Field2>k__BackingField


Если интересно ставьте SOS и играйтесь.
Я это уже делал, и выкладывал результаты в https://habr.com/ru/post/260047/
Заминусили, многого не знал тогда. Но это уже история.
Ответ написан
petermzg
@petermzg
Самый лучший программист
О какой "Таблице методов" речь?
Если вы о VMT, то из названия virtual method table должно быть понятно, что это только для виртуальных методов, которых в статических классах C# - нет.
Так что из статического класса, кроме его метаданных хранить ничего не нужно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы