inline термин в контексте C# / JIT компилятора

318
23 декабря 2016, 11:14

Добрый день.
Столкнулся с таким вопросом,а именно хочу четко понять определение термина,такого как inline метод, соответственно в контексте C#(чтобы вопросы такого рода как "заинлайнить метод" отпали).

И вторая часть вопроса,почему JIT компилятору предпочтительнее inline методы?

Answer 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-компилятора насчёт инлайн-методов.

Этот список, разумеется, не финальный, и будет пересматриваться (в сторону ослабления) в последующих версиях.

READ ALSO
Обобщенный тип и неявное\явное указание типа

Обобщенный тип и неявное\явное указание типа

К примеру имеется два метода, которые выглядят достаточно тривиально,но возникает вопрос,можно ли назвать их следующим образом:

246
Исключения при создании объекта класса [требует правки]

Исключения при создании объекта класса [требует правки]

Народ, есть класс - прямоугольный треугольникКак, вопрос, максимально профессионально отлавливать исключения - "где и когда" - если, например,...

320