Страницы

Поиск по вопросам

четверг, 9 января 2020 г.

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

#cpp #inline


Перевод вопроса: https://stackoverflow.com/q/1759300/5697743.

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

После просмотра различных объяснений возникли вопросы:


Когда мне не следует использовать ключевое слово inline для функции или метода в C++?
Когда комилятор не знает, что нужно сделать функцию 'встроенной'?
Отразится ли как-либо использование многопоточности в приложении на работе inline?

    


Ответы

Ответ 1



inline ближе к static или extern, чем к указанию компилятору встроить ваши функции. extern, static и inline используются в основном линковщиком, а не компилятором. Иногда пишут, что inline указывает компилятору, что по-вашему функция должна быть встроенной. Это было правдой и имело смысл в 1998 году, но спустя двадцать лет компилятору больше не нужны такие подсказки. Не стоит и говорить, что люди часто ошибаются, когда дело доходит до оптимизации кода, так что большинство компиляторов прямо игнорируют такие "подсказки". static - имя функции/переменной не может быть использовано в других единицах трансляции. Линковщик должен убедиться, что это случайно не сделано. extern - использовать это имя в данной единице трансляции, но не жаловаться, если оно не определено. Линковщик разберётся и убедится, что у каждого символа есть адрес. inline - эта функция будет определена в разных единицах трансляции, игнорировать это. Линковщик должен убедится, что все единицы трансляции используют один и тот же экземпляр. Примечание: В целом, определение шаблонов с inline бессмысленно, потому что они уже используют семантику линковки, аналогичную предоставляемой inline. Однако, для явной (explicit) специализации и инициализации шаблонов требуется использовать inline. Ответы на ваши вопросы: Когда мне следует использовать ключевое слово inline для функции или метода в C++? Только когда вы хотите определить функцию в заголовке. Точнее, когда более одного определения функции встречается в различных единицах трансляции. Будет хорошей идеей поместить маленькие (однострочные) функции в заголовок, так как это даст больше информации для оптимизации компилятору. Однако, это увеличит время сборки. Когда мне не следует использовать ключевое слово inline для функции или метода в C++? Не используйте inline только из-за уверенности, что ваш код заработает быстрее. Когда компилятор не знает, что нужно сделать функцию 'встроенной'? В целом, компилятор умеет выполнять такую оптимизацию лучше вас. Однако, он не сможет это сделать, если нет определения функции (в данной единице трансляции). Как правило, в максимально оптимизированном коде все private методы встраиваются, просили вы того, или нет. Для предотвращения встраивания в GCC используйте __attribute__(( noinline )), а в Visual Studio - __declspec(noinline). Отразится ли как-либо использование многопоточности в приложении на работе inline? Многопоточность не влияет как на работу inline, так и на встраивание функций.

Ответ 2



Внутри определения класса все методы с кодом будут inline и определить плохо это или хорошо будет сложно, так как компилятор верит только вам, и предупреждений не будет. class A{ void method(){ очень большой } }; Если код метода выложить вне определения класса с директивой inline в header-файле, то есть шанс, что компилятор сделает предупреждение, что код будет больше. class A{ void method(); }; inline void A::method(){...} Всё-бы хорошо, но компиляторы имеют право на всё, и угадать, как они реализуют сложно. Останется только ваше желание видеть предупреждения или нет.

Комментариев нет:

Отправить комментарий