Страницы

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

воскресенье, 8 декабря 2019 г.

Ключевое слово inline

#cpp


Почему библиотечные функции часто имеют спецификатор inline, а в "обычном" коде его
не встретишь?
    


Ответы

Ответ 1



Спецификатор inline не означает, что функция будет встроена в точке вызова вместо реального вызова. Такими оптимизациями на текущий момент заведует компилятор и только он, он может встроить или не встроить любую функцию, без всякой связи с наличием или отсутствием inline. Реальный смысл inline такой: сообщить компоновщику, что функции с одним именем, которые он видит в разных единицах трансляции — это одна и та же функция, и не нужно выдавать ошибку множественного определения. Таким образом, при помощи inline вы можете определять функцию в header'е. Заметьте, что методы классов, определённые внутри класса, имеют (неявный) inline. Библиотечные функции содержат inline для того, чтобы можно было не определять тело функции в cpp-файле, при этом библиотека таким образом сможет вовсе не содержать файлов с имплементацией.

Ответ 2



Наверное, зависит от того, чей код смотрите. Я довольно часто пишу static inline ..., когда хочу показать (прежде всего другим программистам, для компилятора inline совсем необязательное слово, просто hint), что из соображений эффективности, желал бы видеть этот код вставляемым по месту использования (аналогично коду, определяемому в #define), но одновременно хотел бы, чтобы он был свободен от побочных эффектов расширения аргументов макро (из общих соображений возможных вариантов вызова).

Ответ 3



Определитель inline указывает компилятору, чтобы тот вставлял код функции в место, откуда она вызывается. Например inline int quadrat(int x) { return x*x; } int main() { int y = quadrat(2); return 0; } Этот код будет скомпилирован в: int main() { int y = 2*2; return 0; } Как правило, указать функции определитель inline можно, только если тело функции определено в заголовочном файле (.h). Если тело функции определено в файле .c, то компилятор проигнорирует этот определитель, и функция будет скомпилирована как обычная.

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

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