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

Я думаю, что вы можете найти интересную статью «Использование шаблонов для отражения на C ++» Доминика Филиона. Это в разделе 1.4 из Game Programming Gems 5 . К сожалению, у меня нет моей копии со мной, но ищите ее, потому что я думаю, что она объясняет, о чем вы просите.

496
задан IAmInPLS 2 December 2017 в 10:18
поделиться

7 ответов

Ой, один из моих любимых раздражителей.

inline больше похож на static или extern , чем директива, указывающая компилятору встроить ваши функции. extern , static , inline - это директивы связывания, которые используются почти исключительно компоновщиком, а не компилятором.

Говорят, что inline намекает компилятору, что, по вашему мнению, функция должна быть встроена. Возможно, это было правдой в 1998 году, но десятилетие спустя компилятор не нуждается в таких подсказках. Не говоря уже о том, что люди обычно ошибаются, когда дело доходит до оптимизации кода, поэтому большинство компиляторов категорически игнорируют «подсказку».

  • static - имя переменной / функции не может использоваться в других единицах перевода. Компоновщику необходимо убедиться, что он случайно не использует статически определенную переменную / функцию из другой единицы перевода.

  • extern - используйте это имя переменной / функции в этой единице перевода, но не жалуйтесь, если это не так определены. Компоновщик рассортирует это и удостоверится, что весь код, который пытался использовать какой-либо внешний символ, имеет его адрес.

  • inline - эта функция будет определена в нескольких единицах трансляции, не беспокойтесь об этом. Компоновщику необходимо убедиться, что все единицы трансляции используют один экземпляр переменной / функции.

Примечание: Как правило, объявление шаблонов встроенными бессмысленно, поскольку они имеют семантику связывания ] уже встроено . Однако, явная специализация и создание экземпляров шаблонов требует использования inline .


Конкретные ответы на ваши вопросы:

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

    Только когда вы хотите, чтобы функция была определена в заголовке. Точнее, только тогда, когда определение функции может отображаться в нескольких единицах перевода. Рекомендуется определять небольшие (как в одном лайнере) функции в файле заголовка, поскольку это дает компилятору больше информации для работы при оптимизации вашего кода. Это также увеличивает время компиляции.

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

    Не добавляйте inline только потому, что вы думаете, что ваш код будет работать быстрее, если компилятор встраивает его.

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

    Как правило, компилятор может сделать это лучше вас. Однако компилятор не имеет возможности встроить код, если он не имеет определения функции. В максимально оптимизированном коде обычно все частные методы встроены независимо от того, просите вы об этом или нет.

    В качестве отступления для предотвращения встраивания в GCC используйте __ attribute __ ((noinline)) , а в Visual Studio используйте __ declspec (noinline) .

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

    Многопоточность не влияет на встраивание в в любом случае.

821
ответ дан 22 November 2019 в 22:29
поделиться

You still need to explicitly inline your function when doing template specialization (if specialization is in .h file)

27
ответ дан 22 November 2019 в 22:29
поделиться

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

2) Всегда. См. № 1.

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

18
ответ дан 22 November 2019 в 22:29
поделиться

На самом деле, почти никогда. Все, что вы делаете, это предлагаете компилятору сделать данную функцию встроенной (например, заменить все вызовы этой функции / ее тела). Конечно, нет никаких гарантий: компилятор может проигнорировать директиву.

Компилятор обычно хорошо справляется с обнаружением + оптимизацией таких вещей.

3
ответ дан 22 November 2019 в 22:29
поделиться

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

0
ответ дан 22 November 2019 в 22:29
поделиться

When developing and debugging code, leave inline out. It complicates debugging.

The major reason for adding them is to help optimize the generated code. Typically this trades increased code space for speed, but sometimes inline saves both code space and execution time.

Expending this kind of thought about performance optimization before algorithm completion is premature optimization.

-1
ответ дан 22 November 2019 в 22:29
поделиться

Когда нужно встроить:

1. Когда нужно избежать накладных расходов, связанных с вызовом функции, например, передача параметров, передача управления, возврат управления и т. Д.

2. функция должна быть небольшой, часто вызываемой, и создание встроенной функции действительно выгодно, поскольку в соответствии с правилом 80-20 постарайтесь сделать эту функцию встроенной, что имеет большое влияние на производительность программы.

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

-1
ответ дан 22 November 2019 в 22:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: