In C++ kan een lidfunctie van een class worden gedeclareerd:
Binnen de class (inline definitie):
class A { void foo() { /* ... */ } // direct binnen de class };
Deze functies worden impliciet als inline beschouwd.
Binnen de class (alleen declaratie):
class A { void foo(); // alleen declaratie }; void A::foo() { /* ... */ } // definitie buiten de class
Verschil:
inline, de compiler kan zo'n functie rechtstreeks in de aanroepcode invoegen.inline zonder expliciete aanduiding (inline), hoewel het sleutelwoord kan worden toegevoegd:
inline void A::foo() { /* ... */ }
Voordelen en nadelen van de benaderingen:
Zal een functie, gedefinieerd binnen de class, altijd daadwerkelijk door de compiler worden ingebouwd?
Antwoord: Nee. Het sleutelwoord inline (inclusief impliciete toekenning bij de definitie binnen de class) is slechts een aanbeveling voor de compiler. De compiler kan dit advies negeren als hij de functie te complex of ongeschikt vindt voor inlining.
Verhaal 1
In een groot project waren ledenfuncties gedefinieerd als
inlinebinnen headerbestanden en werden ze opgenomen in duizenden translation units, waardoor de compileertijd meerdere keren toenam en het binaire bestand groeide door code duplicatie — de compiler combineert identieke machine-implementaties niet altijd.
Verhaal 2
In een poging om de uitvoering te versnellen, heeft een ontwikkelaar de gehele logica van de class in de declaratie (in het .h-bestand) geplaatst. Dit leidde ertoe dat bij wijziging van een functie het hele project opnieuw werd opgebouwd, en niet alleen de afzonderlijke bestanden (waarbij de integratie werkelijk werd beïnvloed).
Verhaal 3
Een nieuw teamlid heeft lange methoden voor serialisatie en bestandsbewerking rechtstreeks in de declaratie van de sjabloonclass geplaatst, wat leidde tot een willekeurige verspreiding van fouten over alle TU's, en een overmatige groei van de grootte van het uitvoerbare bestand zonder prestatieverbetering.