Hvad er statisk inline i C (ikke C ++)? Jeg er meget forvirret over, hvorfor mange funktioner erklæret som ' statisk inline ' på Linux-kerne.


Bedste svar

Når en funktion er defineret som statisk , kan funktionen kun ses og bruges i den samme kildefil. Det kan ikke kaldes uden for kildefilen, hvor den er defineret (medmindre en funktionsmarkør bruges til at kalde den). Funktionen “skjules” effektivt uden for den aktuelle kildefil.

Når en funktion er defineret som inline , beder du kompilator til at generere koden til funktionens interner lige hvor funktionsopkaldene finder sted, snarere end at generere opkald til funktionen. Denne teknik kan forbedre ydeevnen ved at fjerne funktionsopkaldsoverhead, men kan som følge heraf øge hukommelsesaftrykket for den genererede kode. Compileren er dog ikke forpligtet til at generere funktionens kode inline, så hvis funktionen er for lang eller kompleks, eller compileren bare ikke kan gøre det af en eller anden grund, genereres et normalt funktionsopkald. Derfor siger vi, at inline bare er et tip til compileren.

Sætter dem sammen, en funktion der er defineret som begge statisk og inline er en, der vil være usynlig uden for den aktuelle kildefil, og en hvis kode vil genereres inline, uanset hvor du kalder det, hvis compileren kan gøre det. Denne tilgang bruges almindeligvis til meget små, enkle, ofte kaldte interne hjælperfunktioner, der ikke er en del af et offentligt API.

Svar

I tilfælde af inline-funktioner er koden i dem kopieres til opkaldsfunktionen uden funktionsopkaldets overhead.

I kernen er den meget brugt. Dette gøres typisk som en måde at forbedre ydeevnen på, mere optimering, selvom det ikke nødvendigvis er tilfældet.

Det bruges hovedsageligt til mindre tidskritiske funktioner, og vi kan se stor ydeevneforskel ved at gøre det.

Men selvom vi ikke bruger inline-nøgleord, kan compileren muligvis forsøge at gøre inlining som en del af optimeringen.

Som en tommelfingerregel skal statiske inline-funktioner være i en overskrift. Det definerer en inline-funktion med intern kobling. Så vi kan sige, at sådanne funktioner vil være lokale for en translationel enhed og indbygget i den.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *