inline is een hint voor de compiler om de functieaanroep te vervangen door de inhoud ervan (code-invoeging). Dit kan de uitvoering versnellen (geen overhead voor de aanroep), maar leidt tot een toename van de binaire omvang.
Syntaxis:
inline int square(int x) { return x * x; }
De compiler kan inline negeren. Voor gelijktijdige zichtbaarheid en implementatie van de functie in verschillende bestanden wordt gebruikt:
// header.h inline int min(int a, int b) { return a < b ? a : b; }
Het volledige lichaam van de functie moet beschikbaar zijn in elk bestand waar de inline-functie wordt aangeroepen, d.w.z. de gebruikelijke manier is om de functie in de headerfile te definiëren.
Als je een inline-functie alleen in één .c-bestand declareert en definieert, kunnen andere modules deze niet gebruiken, wat leidt tot linkfouten (undefined reference).
Wat is het verschil tussen dergelijke declaraties in de headerfile?
inline int foo(int x) { return x + 1; } static inline int bar(int x) { return x + 1; }
inline int foo(...) zorgt ervoor dat de functie meerdere zwakke definities kan hebben (one definition rule). Als uit meerdere .c-bestanden dezelfde header is ingesloten, kan de linker een fout geven over meerdere definities.static inline maakt de functie intern voor elke module: elke verbinding krijgt zijn eigen kopie, er zullen geen problemen zijn tijdens het linken. Dit is het veiligst voor inline-functies in headers.Verhaal
In de bibliotheek van wiskundige functies werden veel inline-hulpfuncties gedefinieerd in een .c-bestand. Bij het proberen deze uit andere modules te gebruiken, traden linkfouten op omdat de definities alleen zichtbaar waren in één objectbestand.
Verhaal
Na het verplaatsen van inline-functies uit het .c-bestand naar de header, ging het project vastlopen tijdens het linken: de linker klaagde over meerdere definities van dezelfde functie. Dit werd opgelost door ze te vervangen door static inline in de headerbestanden.
Verhaal
Bij het optimaliseren van een intern algoritme werd inline gebruikt voor "kritische" functies, in de hoop op versnelling. Maar de compiler negeerde de hint, en de profiler toonde aan dat de aanroepkosten niet waren verlaagd. Het probleem werd pas opgelost na handmatige analyse van de optimalisatie-instellingen van de compiler.