Нахождение методов в памяти

223
16 января 2019, 03:10

Есть переменные (объекты) которые могут храниться как в куче так и в стеке. Есть реализации методов у какого-то класса. (Речь не будет идти о виртуальных методах и VTable)

Где хранятся реализации методов в памяти, если они там хранятся? И как программа знает как (или по какому адресу) выполнять эти методы?

Answer 1

В .NET реализация методов находится в памяти в 2 экземплярах: MSIL-коде, и в машинном коде. При компиляции MSIL-кода JIT создает в памяти функции на машинном коде. При этом JIT знает соответствия между .NET методами, и адресами функций на машинном коде. В итоге при генерации машинного кода JIT просто подставляет адреса этих функций. Они не будут меняться (перемещаться в памяти), так что волноваться не о чем.

Пример. C# код:

Console.ReadKey();
Console.ReadKey();
Console.ReadKey();
Debugger.Break();

Сгенерированный машинный код:

lea         rcx,[rsp+48h]  
xor         edx,edx  
call        000007FEF1820C00  // Console.ReadKey
lea         rcx,[rsp+38h]  
xor         edx,edx  
call        000007FEF1820C00  // Console.ReadKey
lea         rcx,[rsp+28h]  
xor         edx,edx  
call        000007FEF1820C00  // Console.ReadKey
call        000007FEF181E870  // Debugger.Break

Как видно, в рантайме никто не ищет методы, иначе все бы работало намного медленнее.

CLR держит в памяти структуры, называемыми Method Table Structure. Для каждого класса и каждого метода CLR помнит, есть ли скомпилированная в машинный код версия метода, и если есть, то где находится ее адрес.

Для каждого типа CLR создает структуру, которая описывает его. В этой структуре находится таблица методов (включая информацию по виртуальным методам). Все эти CLR-структуры находятся в отдельной области памяти, которой управляет CLR. Область памяти с экземплярами .NET-классов (Managed Heap) находиться отдельно, и она управляется сборщиком мусора.

Answer 2

как программа знает как (или по какому адресу) выполнять эти методы?

Каждая программа работает с памятью не напрямую с физической, а с виртуальной памятью, думая, что она владеет полностью всей памяти и никто(другой процесс) не может ей мешать, хотя по факту часть программы может вообще находится не в ОЗУ, а быть выгруженной на диск, но для программы это прозрачно и она видит непрерывное адресное пространство.

Как следствие, компилятор на стадии компиляции может указать, что такой то метод находится по такому-то адресу, а такой то по такому не вычисляя ничего в рантайме.

Далее ОС используя виртуальные таблицы преобразует виртуальную память в физическую и обращается к физическим ячейкам.

Рихетр "Операционные системы"

READ ALSO
C# возврат с потока

C# возврат с потока

если Wait() уберу, то возвратиться пустой результатА так никакой асинхронности

289
Как активировать кнопку при выборе двух элементов ListView? WPF

Как активировать кнопку при выборе двух элементов ListView? WPF

Есть ListView и кнопка для сравнения двух элементов, которая должна быть активна, когда выбраны два элементаЕсть такой код XAML:

270
C# WPF Prism PopupWindowAction События окна

C# WPF Prism PopupWindowAction События окна

Хочу сделать свою "non client area" в popup окнеКак и где мне можно работать с code-behind PopupWindowAction окна? Можно ли реагировать на события PopupWindowAction окна...

184
Объясните код c#

Объясните код c#

Вот кодЧто делает, понять не могу

231