Сообщение Re[64]: MS забило на дотнет. Питону - да, сишарпу - нет? от 14.09.2021 11:52
Изменено 14.09.2021 18:18 vdimas
Re[64]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:
S>Выводы
S>В ходе нашего маленького исследования были получены следующие выводы:
S>TypeHandle является указателем либо на MethodTable, либо на TypeDesc (зависит от типа объекта)
И в любом случае первое поле объекта указывает на typeinfo, который представлен объектом RuntimeType.
Т.е., оно выглядит так:
Соответственно, адрес, скажем, 4-й виртуальной ф-ии:
В плюсах путь короче:
Еще что забавно, что для пущей эффективности в том лейауте было бы неплохо сделать указатель на VMT первым полем RuntimeType, но RuntimeType — это такой же Object, первое поле уже занято. ))
S>Выводы
S>В ходе нашего маленького исследования были получены следующие выводы:
S>TypeHandle является указателем либо на MethodTable, либо на TypeDesc (зависит от типа объекта)
И в любом случае первое поле объекта указывает на typeinfo, который представлен объектом RuntimeType.
Т.е., оно выглядит так:
class Object {
private RuntimeType _type;
public Type GetType() => _type;
public virtual void ToString() = _type.ToString();
...
}
unsafe class RuntimeType {
...
// по смещению 0x40 в AMDx64 ссылка на VMT (или TypeDesc)
private IntPtr* _vmt;
...
}
Соответственно, адрес, скажем, 4-й виртуальной ф-ии:
IntPtr * funcAddr = obj->_type->_vmt[4];
В плюсах путь короче:
IntPtr * funcAddr = obj->_vmt[4];
Еще что забавно, что для пущей эффективности в том лейауте было бы неплохо сделать указатель на VMT первым полем RuntimeType, но RuntimeType — это такой же Object, первое поле уже занято. ))
Re[64]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, Serginio1, Вы писали:
S>Выводы
S>В ходе нашего маленького исследования были получены следующие выводы:
S>TypeHandle является указателем либо на MethodTable, либо на TypeDesc (зависит от типа объекта)
И в любом случае первое поле объекта указывает на typeinfo, который представлен объектом RuntimeType.
Т.е., оно выглядит так:
Соответственно, адрес, скажем, 4-й виртуальной ф-ии:
В плюсах путь короче:
Еще что забавно, что для пущей эффективности в том лейауте было бы неплохо сделать указатель на VMT первым полем RuntimeType, но RuntimeType — это такой же Object, первое поле уже занято. ))
S>Выводы
S>В ходе нашего маленького исследования были получены следующие выводы:
S>TypeHandle является указателем либо на MethodTable, либо на TypeDesc (зависит от типа объекта)
И в любом случае первое поле объекта указывает на typeinfo, который представлен объектом RuntimeType.
Т.е., оно выглядит так:
class Object {
private RuntimeType _type;
public Type GetType() => _type;
public virtual void ToString() = _type.ToString();
...
}
unsafe class RuntimeType {
...
// по смещению 0x40 в AMDx64 ссылка на VMT (или TypeDesc)
private IntPtr* _vmt;
...
}
Соответственно, адрес, скажем, 4-й виртуальной ф-ии:
IntPtr funcAddr = obj->_type->_vmt[4];
В плюсах путь короче:
IntPtr funcAddr = obj->_vmt[4];
Еще что забавно, что для пущей эффективности в том лейауте было бы неплохо сделать указатель на VMT первым полем RuntimeType, но RuntimeType — это такой же Object, первое поле уже занято. ))