C++
Inlinefunktioner
Sök…
Introduktion
En funktion som definieras med inline
specifikatorn är en inline-funktion. En inline-funktion kan multipliceras utan att bryta mot One Definition-regeln och kan därför definieras i en rubrik med extern länkning. Att förklara en funktion inline antyder kompilatorn att funktionen ska vara inlinerad under kodgenerering, men ger ingen garanti.
Syntax
-
inline
function_deklaration -
inline
function_definition - klass {function_definition};
Anmärkningar
Vanligtvis om kod som genereras för en funktion är tillräckligt liten är det en bra kandidat att vara inriktad. Varför då? Om en funktion är stor och är inriktad i en slinga, för alla samtal som gjordes, skulle den stora funktionens kod kopieras vilket leder till den genererade binära storleken. Men hur liten räcker det?
Även om inline-funktioner verkar vara ett bra sätt att undvika att funktionen ringer över huvudet, bör det noteras att inte alla funktioner som är markerade inline
är inline. Med andra ord, när du säger inline
är det bara ett ledtråd till kompilatorn, inte en beställning: kompilatorn är inte skyldig att inlinefunktionen, det är gratis att ignorera den - de flesta gör det. Moderna kompilatorer är bättre på att göra sådana optimeringar att det här nyckelordet nu är en förtjänstfigur, när detta förslag om funktionsinlining av programmeraren togs på allvar av kompilatorerna. Även funktioner som inte är markerade inline
är inlinerade av kompilatorn när den ser nytta av det.
Inline som ett kopplingsdirektiv
Den mer praktiska användningen av inline
i modern C ++ kommer från att använda det som ett kopplingsdirektiv. När man definierar , inte deklarerar, en funktion i en rubrik som kommer att inkluderas i flera källor, kommer varje översättningsenhet att ha sin egen kopia av denna funktion som leder till en ODR (One Definition Rule) -överträdelse; denna regel säger grovt att det bara kan finnas en definition av en funktion, variabel, etc. För att kringgå denna överträdelse genom att markera funktionsdefinitionen inline
implicit gör funktionskopplingen intern.
Vanliga frågor
När ska jag skriva nyckelordet 'inline' för en funktion / metod i C ++?
Endast när du vill att funktionen ska definieras i en rubrik. Mer exakt bara när funktionens definition kan visas i flera kompilationsenheter. Det är en bra idé att definiera små (som i en liner) funktioner i rubrikfilen eftersom det ger kompilatorn mer information att arbeta med medan du optimerar din kod. Det ökar också sammanställningstiden.
När ska jag inte skriva nyckelordet 'inline' för en funktion / metod i C ++?
Lägg inte inline
när du tror att din kod kommer att köras snabbare om kompilatorn inlines den.
När kommer kompilatorn inte att veta när man ska göra en funktion / metod inline?
Generellt kommer kompilatorn att kunna göra detta bättre än dig. Men kompilatorn har inte möjlighet att inlinekod om den inte har funktionsdefinitionen. I maximalt optimerad kod anges vanligtvis alla privata metoder oavsett om du ber om det eller inte.
Se även
Inline-funktionsdeklaration
inline int add(int x, int y);
Inline-funktionsdefinition
inline int add(int x, int y)
{
return x + y;
}
Inline-funktioner för medlemmar
// header (.hpp)
struct A
{
void i_am_inlined()
{
}
};
struct B
{
void i_am_NOT_inlined();
};
// source (.cpp)
void B::i_am_NOT_inlined()
{
}
Vad är funktionsinline?
inline int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1, b = 2;
int c = add(a, b);
}
I koden ovan, när add
inriktas, skulle den resulterande koden bli något liknande
int main()
{
int a = 1, b = 2;
int c = a + b;
}
Inline-funktionen är ingenstans att se, kroppen blir inlinerad i den som ringer. Hade add
inte varit inriktat, skulle en funktion kallas. Kostnaden för att ringa en funktion - som att skapa en ny stapelram , kopiera argument, göra lokala variabler, hoppa (förlora referensplats och där av cachemissar), etc. - måste uppstå.