7

Когда следует использовать ключевое слово 'inline' для функции/метода?

28

Когда следует использовать ключевое слово inline для функции/метода в C++?

Я наткнулся на различные ответы на этот вопрос и возникли некоторые связанные вопросы:

  • Когда мне не следует использовать ключевое слово 'inline' для функции/метода в C++?

  • В каких случаях компилятор не сможет решить, когда сделать функцию/метод 'inline'?

  • Имеет ли значение, является ли приложение многопоточным, когда мы пишем 'inline' для функции/метода?

5 ответ(ов)

0

Вам все равно нужно явно использовать inline для вашей функции при специализации шаблона (если специализация находится в .h файле).

0
  1. В настоящее время практически никогда. Если есть смысл встроить функцию, компилятор сделает это без вашей помощи.

  2. Всегда. Смотрите пункт #1.

(Отредактировано, чтобы отразить то, что вы разделили свой вопрос на два...)

0

Когда не следует использовать ключевое слово inline для функции/метода в C++?

Если функция объявлена в заголовочном файле и определена в файле .cpp, то вы не должны писать это ключевое слово.

Когда компилятор не сможет определить, когда следует делать функцию/метод 'inline'?

Такой ситуации не существует. Компилятор не может сделать функцию inline. Всё, что он может сделать, это встроить некоторые или все вызовы этой функции. Он не сможет это сделать, если не имеет кода функции (в таком случае это должен сделать линкер, если у него есть такая возможность).

Имеет ли значение, является ли приложение многопоточным, когда вы пишете 'inline' для функции/метода?

Нет, это совершенно не имеет значения.

0

Когда компилятор не будет знать, когда сделать функцию/метод «inline»?

Это зависит от используемого компилятора. Не стоит слепо доверять тому, что современные компиляторы лучше людей знают, когда применять инлайнинг. Никогда не следует использовать инлайнинг как основное средство для повышения производительности, так как это директива линковки, а не оптимизационный совет. Хотя я согласен, что с идеологической точки зрения эти аргументы верны, реальность может оказаться совершенно иной.

После прочтения множества обсуждений я из любопытства протестировал эффекты инлайнинга на коде, над которым работаю, и результаты показали, что я получил заметный прирост скорости для GCC и никакого прироста для Intel Compiler.

(Подробнее: математические симуляции с несколькими критическими функциями, определенными вне класса, GCC 4.6.3 (g++ -O3), ICC 13.1.0 (icpc -O3); добавление inline в критические точки дало +6% прирост скорости с кодом GCC).

Так что, если вы считаете GCC 4.6 современным компилятором, результат таков: директива inline все еще имеет значение, если вы пишете ресурсоемкие задачи и точно знаете, где находится узкое место.

0

В Visual Studio 9 (15.00.30729.01) я проверил это, скомпилировав с флагом /FAcs и просмотрев ассемблерный код. Компилятор сгенерировал вызовы членов класса без включенной оптимизации в отладочном режиме. Даже если функция помечена как __forceinline, код инлайнинга во время выполнения не создается.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь