Функция, которую вы пометили как встроенную, может быть встроена компилятором. Нет гарантии, что compielr сделает это. Сам компилятор использует сложную семантику для устройства, когда это делать или нет.
Когда компилятор решает, что функция должна быть встроенной, вызов функции в коде вызывающей стороны заменяется кодом вызываемого кода. Это означает, что вы сохраняете операции стека, сам вызов и улучшаете локальность кэша кода. Иногда это может привести к огромному увеличению производительности. Специально для однострочных функций доступа к данным, таких как методы доступа, используемые в объектно-ориентированном коде.
Стоимость - это то, что обычно приводит к увеличению кода, что может снизить производительность. Вот почему установка функции для встроенного является всего лишь «зеленым флагом» для компилятора, которому не нужно следовать. Компилятор постарается сделать то, что лучше.
Как правило, для начинающих, которые не хотят иметь дело с особенностями связывания. встроенная функция должна вызываться другой функцией в тех же единицах компиляции. Если вы хотите реализовать встроенную функцию, которая может использоваться на нескольких блоках компиляции, сделайте это объявленным файлом заголовка и внедрите встроенную функцию.
Почему?
Пример: в заголовочном файле inlinetest.h
int foo();
inline int bar();
В модуле компиляции inlinetest.cpp
int foo(){ int r = bar(); return r; }
inline int bar(){ return 5;};
Затем на main.cpp
#include "inlinetest.h"
int main()
{
foo();
//bar();
}
Компиляция одного объектного файла за раз. Если вы раскомментируете этот вызов «bar», у вас будет ошибка. Потому что встроенная функция реализована только в объектном файле inlinetest.o и не экспортируется. В то же время функция foo, скорее всего, встраивает в нее код функции bar (так как bar является однострочной операцией ввода-вывода без операции ввода, то весьма вероятно, что она будет встроена в строку)
Но если в файле заголовка вы объявили встроенную функцию и внедрили ее в строку, то вы сможете использовать ее в любом модуле компиляции, который включает этот заголовок.
(«пример кода»);
Удалите ключевое слово inline, и компилятор НЕ вызовет ошибку даже при вызове bar в main. И никакого inline не произойдет, если вы не попросите компилятор встроить все функции. Это не стандартное поведение на большинстве компиляторов.