Pull to refresh

Comments 15

Имхо, вы забыли ответить на главный вопрос — нафига? Все-таки смысл с# именно в управлении памятью системой…
Для фана, полагаю. ИМХО, практически единственная ситуация, где такое могло бы быть полезно на практике — это оптимизировать какой-то критичный локальный участок в уже существующем продукте. Да и то проще уже тогда на нативный код переписать, чем использовать такой ад, который может сломаться от чиха в любой момент…
Для скорости роста бороды, конечно)
Чтобы чувствовать себя совсем крутым дядькой, который знает как оно там внутри на самом деле устроено.
Кругозор, общая эрудиция и все такое…
Во-первых для фана. Второе — мне просто приятно знать, как что устроено. И вовсе не для «борды», как написал оратор выше. Вам же наверняка стало также интересно. Вот и мне было интересно, когда копался в этом =)
А по этому адресу мы берем указатель на нужный метод и вызываем его. Значит чтобы любой участок памяти представить как объект определенного типа необходимо просто записать указатель на таблицу виртуальных методов.
Прямо-таки и необходимо? Это нужно только для виртуальных методов, обычные же методы вызываются напрямую, не задействуя таблицу виртуальных методов вообще никак.
Обычно для вызова методов используется callvirt. Где-то читал, что они этим сэкономили на явной проверке валидности указателя, так как callvirt проверяет и босает NullReference если надо
Если метод — не виртуальный, то callvirt будет преобразован в обычный call на этапе оптимизации, разве нет?
А компилятор оптимизацией и не занимается, это задача JIT.
Оптимизацией занимается и компилятор, и JIT. Иначе не было бы разницы между Release и Debug. Раскручивание циклов, удаление мертвого кода, удаление неиспользуемых переменных и еще много чего выполняется именно на этапе трансляции из C# в IL
Нет. call для статических методов, остальные через callvirt. Выше верно сказали про проверку на null
кстати, для задротской оптимизации, если надо вызвать нестатический метод у класса и ничего с объектом больше не делать — лучше делать new Program().Foo(); чем var p = new Program(); p.Foo(); ибо в первом случае будет call, без virt. =)
Вы не пробовали создать делегат на конструктор?
При каких условиях ваш код перестанет работать?
Sign up to leave a comment.