Слышал про некую команду для CLR, которая называется newobj, и у меня возник вопрос: а что конкретно выполняет эта команда? Зачем она нужна?
Получив команду newobj, CLR выполняет следующие действия:
1. Подсчитывает число байт, необходимых для размещения полей типа (и полей всех его базовых типов).
2. Прибавляет к полученному значению число байт, необходимых для размещения системных полей объекта. У каждого объекта есть пара таких полей: указатель на объект тип и SyncBlockIndex. В 32разрядных приложениях для каждого из этих полей требуется 32 бита, что увеличивает размер каждого объект та на 8 байт, а в 64 разрядных приложениях каждое поле занимает 64 бита, добавляя к каждому объекту 16 байт.
3. Проверяет, хватает ли в зарезервированной области доступных байт, чтобы выделить память для объекта (и при необходимости передает память). Если в управляемой куче достаточно места для объекта, ему выделяется память, начиная с адреса, на который указывает NextObjPtr, а занимаемые им байты обнуляются. Далее вызывается конструктор типа (передающий NextObjPtrв качестве параметра this), и ILкоманда newobj(или оператор newв C#) возвращает адрес объекта. Перед возвратом этого адреса NextObjPtrпереходит на первый адрес после объекта, указывая на адрес, по которому в куче будет помещен следующий объект
CLR via C#