#c_sharp #методы #компилятор #inline #jit
Добрый день.
Столкнулся с таким вопросом,а именно хочу четко понять определение термина,такого
как inline метод, соответственно в контексте C#(чтобы вопросы такого рода как "заинлайнить
метод" отпали).
И вторая часть вопроса,почему JIT компилятору предпочтительнее inline методы?
Ответы
Ответ 1
В контексте C#, насколько я понимаю, inline-подстановка означает оптимизацию при
компиляции, при которой тело вызываемого метода встраивается в вызывающую функцию вместо
вызова. На текущий момент такими оптимизациями занимается только JIT-компилятор.
В C# вы не можете заставить компилятор заинлайнить функцию, но вы можете попросить
его об этом, используя атрибут [MethodImpl(MethodImplOptions.AggressiveInlining)].
Также вы можете попросить компилятор не встраивать функцию, указав атрибут [MethodImpl(MethodImplOptions.NoInlining)].
В отличие от этого в C++ ключевое слово inline означает, что сборщик должен игнорировать
факт множественного определения функции в различных модулях компиляции (ослабляя тем
самым ODR).
По поводу второй части вопроса: инлайнингом в C# занимается JIT-компилятор потому,
что он знает точно целевую платформу. Точные критерии решения JIT-компилятора насчёт
того, инлайнить ли данную функцию, меняются от версии к версии.
Согласно этому сообщению, инлайнингу не подвержены методы, которые:
Маркированы атрибутом MethodImplOptions.NoInlining
Размер IL-кода которых больше 32 байт (при отсутствии атрибута MethodImplOptions.AggressiveInlining)
Виртуальные методы
Метод, принимающие тип-значение большого размера как параметр
Методы в классах, производных от MarshalByRefObject
Методы со сложным потоком управления
например, рекурсивные методы
и методы с обработкой исключений
Методы с экзотическими инструкциями, проверками безопасности и т. п.
Вот такой «список предпочтений» JIT-компилятора насчёт инлайн-методов.
Этот список, разумеется, не финальный, и будет пересматриваться (в сторону ослабления)
в последующих версиях.