C++
Inline functies
Zoeken…
Invoering
Een functie gedefinieerd met de inline
specificator is een inline-functie. Een inline-functie kan vermenigvuldigd worden gedefinieerd zonder de One Definition-regel te overtreden en kan daarom worden gedefinieerd in een koptekst met externe koppeling. Het declareren van een functie inline geeft de compiler aan dat de functie tijdens het genereren van de code moet worden aangegeven, maar biedt geen garantie.
Syntaxis
-
inline
functie_verklaring -
inline
functie_definitie - class {function_definition};
Opmerkingen
Meestal als de code die voor een functie wordt gegenereerd voldoende klein is, is het een goede kandidaat om inline te worden. Waarom? Als een functie groot is en in een lus is aangegeven, zou de code van de grote functie voor alle gemaakte oproepen worden gedupliceerd, wat leidt tot de gegenereerde binaire grootte bloat. Maar hoe klein is voldoende?
Hoewel inline-functies een geweldige manier lijken te zijn om te voorkomen dat functies overhead oproepen, moet worden opgemerkt dat niet alle functies die inline
zijn gemarkeerd, inline
zijn. Met andere woorden, als u inline
zegt, is dit slechts een hint voor de compiler, geen opdracht: de compiler is niet verplicht om de functie te inline te plaatsen, het is vrij om deze te negeren - de meeste doen dat. Moderne compilers zijn beter in het maken van zulke optimalisaties dat dit trefwoord nu een overblijfsel van het verleden is, toen deze suggestie van functieinlining door de programmeur serieus werd genomen door de compilers. Zelfs functies die niet als inline
zijn gemarkeerd, worden door de compiler aangegeven als deze daar voordeel uit ziet.
Inline als koppelingsrichtlijn
Het meer praktische gebruik van inline
in moderne C ++ komt voort uit het gebruik van een koppelingsrichtlijn. Bij het definiëren , niet declareren, van een functie in een koptekst die in meerdere bronnen wordt opgenomen, heeft elke vertaaleenheid een eigen kopie van deze functie die leidt tot een overtreding van de ODR (One Definition Rule); deze regel ruwweg zegt dat er slechts één definitie van een functie, variabele, enz. kan zijn om deze schending te omzeilen, het markeren van de functie definitie inline
impliciet maakt de functie koppeling intern.
Veelgestelde vragen
Wanneer moet ik het trefwoord 'inline' schrijven voor een functie / methode in C ++?
Alleen als u de functie in een koptekst wilt definiëren. Meer precies alleen wanneer de definitie van de functie kan worden weergegeven in meerdere compilatie-eenheden. Het is een goed idee om kleine (zoals in één voering) functies in het headerbestand te definiëren, omdat dit de compiler meer informatie geeft om mee te werken en tegelijkertijd uw code optimaliseert. Het verhoogt ook de compilatietijd.
Wanneer moet ik het sleutelwoord 'inline' voor een functie / methode in C ++ niet schrijven?
Voeg geen inline
als u denkt dat uw code sneller zal werken als de compiler deze inline
plaatst.
Wanneer weet de compiler niet wanneer een functie / methode inline moet worden gemaakt?
Over het algemeen kan de compiler dit beter dan u. De compiler heeft echter niet de optie om code te inline te zetten als deze niet de functiedefinitie heeft. In de maximaal geoptimaliseerde code zijn meestal alle privé-methoden aangegeven, of u er nu om vraagt of niet.
Zie ook
Niet-aangesloten inline functieverklaring
inline int add(int x, int y);
Definitie van niet-leden inline functie
inline int add(int x, int y)
{
return x + y;
}
Inline functies voor leden
// header (.hpp)
struct A
{
void i_am_inlined()
{
}
};
struct B
{
void i_am_NOT_inlined();
};
// source (.cpp)
void B::i_am_NOT_inlined()
{
}
Wat is functieinlining?
inline int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
int c = add(a, b);
}
In de bovenstaande code, wanneer add
inline is, zou de resulterende code zoiets als dit worden
int main()
{
int a = 1, b = 2;
int c = a + b;
}
De inline functie is nergens te zien, haar lichaam krijgt de lijnen in het lichaam van de beller. Als add
niet was onderstreept, zou een functie worden aangeroepen. De overhead van het aanroepen van een functie - zoals het maken van een nieuw stapelframe , het kopiëren van argumenten, het maken van lokale variabelen, springen (het verliezen van de referentielocatie en daar door cache-missers), enz. - moet worden gemaakt.