Страницы

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

пятница, 15 февраля 2019 г.

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

Перевод вопроса: https://stackoverflow.com/q/1759300/5697743
Когда мне следует использовать ключевое слово inline для функции или метода в C++?
После просмотра различных объяснений возникли вопросы:
Когда мне не следует использовать ключевое слово inline для функции или метода в C++? Когда комилятор не знает, что нужно сделать функцию 'встроенной'? Отразится ли как-либо использование многопоточности в приложении на работе inline?


Ответ

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, так и на встраивание функций.

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

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