Vad är statisk inline i C (inte C ++)? Jag är mycket förvirrad över varför många funktioner deklareras som ' statisk inline ' på Linux-kärnan.


Bästa svaret

När en funktion definieras som statisk kan funktionen bara ses och används i samma källfil. Det kan inte anropas utanför källfilen där den är definierad (om inte en funktionspekare används för att anropa den). Funktionen är ”gömd” från synen utanför den aktuella källfilen.

När en funktion definieras som inline ber du kompilator för att generera koden för funktionens interner precis där funktionsanropen äger rum, snarare än att generera samtal till funktionen. Denna teknik kan förbättra prestanda genom att eliminera funktionssamtalskostnader, men kan som en följd öka minnesavtrycket för den genererade koden. Kompilatorn är dock inte skyldig att generera funktionens kod inline, så om funktionen är för lång eller komplex, eller om kompilatorn helt enkelt inte kan göra det av någon anledning, genereras ett normalt funktionssamtal. Därför säger vi att inline bara är en ledtråd till kompilatorn.

Att sätta ihop dem, en funktion som definieras som båda statisk och inline är en som är osynlig utanför den aktuella källfilen, och en vars kod kommer att genereras inline var du än kallar det, om kompilatorn kan göra det. Detta tillvägagångssätt används vanligtvis för mycket små, enkla, ofta kallade interna hjälpfunktioner som inte ingår i ett offentligt API.

Svar

Vid integrerade funktioner, koden i dem kopieras till samtalsfunktionen utan funktionsanropets overhead.

I kärnan används den ofta. Detta görs vanligtvis som ett sätt att förbättra prestanda, mer optimering, men inte nödvändigtvis.

Det används huvudsakligen för korta tidskritiska funktioner och vi kan se stor skillnad i prestanda genom att göra det.

Men även om vi inte använder inline-nyckelord kan kompilatorn försöka göra inline som en del av optimeringen.

Som en tumregel bör statiska inline-funktioner vara i en rubrik. Den definierar en inbyggd funktion med intern koppling. Så vi kan säga att sådana funktioner kommer att vara lokala för en översättningsenhet och integreras i den.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *