Inline-функции — это функции, для которых компилятор может (но не обязан) заменить вызов прямым вставлением кода функции в место вызова. Для этого используется ключевое слово inline.
inline даёт компилятору совет, но не обязательство: может быть проигнорировано, если функция слишком сложная.Ограничения и риски:
Пример:
inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get() будет рассматриваться как inline
Вопрос: Гарантирует ли ключевое слово inline, что функция будет встроена во всех точках вызова?
Ответ: Нет. Компилятор принимает решение о подстановке функции inline самостоятельно, исходя из внутренних эвристик. inline — только рекомендация.
История
В финансовой системе был написан часто используемый логгер с десятками больших inline-функций. После роста системы размер бинарника увеличился в разы, что привело к увеличению времени линковки и уменьшению кэширующей эффективности на сервере.
История
При миграции кроссплатформенного ПО обнаружили, что некоторые компиляторы (например, MSVC и GCC) по-разному обрабатывают inline: часть функций не разворачивалась inline, часть — наоборот, что вызывало трудновоспроизводимые различия в скорости и размере приложений между платформами.
История
Разработчик объявил inline-функции только в header-файле, но реализацию вынес в отдельный cpp-файл. В результате при линковке возникали ошибки multiple definition или unresolved external, так как inline-функции должны быть определены именно в заголовках.