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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow