Funkcje inline to funkcje, dla których kompilator może (ale nie musi) zastąpić wywołanie bezpośrednim wstawieniem kodu funkcji w miejscu wywołania. W tym celu używa się słowa kluczowego inline.
inline daje kompilatorowi wskazówkę, ale nie obowiązek: może być zignorowane, jeśli funkcja jest zbyt skomplikowana.Ograniczenia i ryzyka:
Przykład:
inline int add(int a, int b) { return a + b; } struct X { int get() const { return value; } int value; }; // get() będzie traktowana jako inline
Pytanie: Czy słowo kluczowe inline gwarantuje, że funkcja zostanie wbudowana w każdym miejscu wywołania?
Odpowiedź: Nie. Kompilator podejmuje decyzję o podstawieniu funkcji inline samodzielnie, w oparciu o wewnętrzne heurystyki. inline to tylko rekomendacja.
Historia
W systemie finansowym został napisany często używany logger z dziesiątkami dużych funkcji inline. Po wzroście systemu rozmiar binarki zwiększył się wielokrotnie, co doprowadziło do wydłużenia czasu linkowania i zmniejszenia efektywności pamięci podręcznej na serwerze.
Historia
Przy migracji oprogramowania wieloplatformowego odkryto, że niektóre kompilatory (np. MSVC i GCC) różnie obsługują inline: część funkcji nie była rozwijana inline, część wręcz przeciwnie, co powodowało trudne do odtworzenia różnice w prędkości i rozmiarze aplikacji między platformami.
Historia
Programista ogłosił funkcje inline tylko w pliku nagłówkowym, ale implementację przeniósł do oddzielnego pliku cpp. W rezultacie przy linkowaniu pojawiały się błędy wielu definicji lub niezdefiniowanych zewnętrznych, ponieważ funkcje inline muszą być definiowane właśnie w nagłówkach.