W C++ funkcję członka klasy można zadeklarować:
W klasie (definicja inline):
class A { void foo() { /* ... */ } // bezpośrednio w klasie };
Takie funkcje są automatycznie uważane za inline.
W klasie (tylko deklaracja):
class A { void foo(); // tylko deklaracja }; void A::foo() { /* ... */ } // definicja poza klasą
Różnica:
inline, kompilator może wprowadzić tę funkcję bezpośrednio do kodu jej wywołania.inline bez wyraźnego wskazania (inline), chociaż słowo kluczowe można dodać:
inline void A::foo() { /* ... */ }
Zalety i wady podejść:
Czy każda funkcja zdefiniowana w klasie będzie rzeczywiście wbudowana przez kompilator?
Odpowiedź: Nie. Słowo kluczowe inline (w tym niejawne przypisanie przy definicji wewnątrz klasy) to tylko sugestia dla kompilatora. Kompilator może zignorować tę wskazówkę, jeśli uzna funkcję za zbyt złożoną lub nieuzasadnioną do wbudowania.
Historia 1
W dużym projekcie funkcje członkowskie były definiowane jako
inlinew plikach nagłówkowych i włączane w tysiące jednostek tłumaczenia, co spowodowało, że czas kompilacji wzrósł kilka razy, a binarka zwiększyła się z powodu duplikacji kodu — kompilator nie zawsze łączy identyczną implementację maszynową.
Historia 2
W próbie przyspieszenia wykonania, programista przeniósł całą logikę klasy do deklaracji (w pliku .h). Doprowadziło to do tego, że przy zmianie funkcji cały projekt był rekompilowany, a nie tylko pojedyncze pliki (które rzeczywiście miały wpływ na integrację).
Historia 3
Nowy członek zespołu umieścił długie metody serializacji i pracy z plikami bezpośrednio w deklaracji szablonowej klasy, wywołując przypadkowe rozprzestrzenienie błędów w całym TU oraz nadmierny wzrost rozmiaru pliku wykonywalnego bez przyrostu wydajności.