Wat is statisch inline in C (niet in C ++)? Ik ben vaak in de war waarom veel functies zijn gedeclareerd als ' statisch inline ' op Linux Kernel.


Beste antwoord

Wanneer een functie is gedefinieerd als statisch , kan de functie alleen gezien en gebruikt worden binnen hetzelfde bronbestand. Het kan niet worden aangeroepen van buiten het bronbestand waar het is gedefinieerd (tenzij een functie-pointer wordt gebruikt om het aan te roepen). De functie is in feite aan het zicht buiten het huidige bronbestand “verborgen”.

Wanneer een functie is gedefinieerd als inline , vraagt ​​u de compiler om de code te genereren voor de interne onderdelen van de functie precies waar de functie-aanroepen plaatsvinden, in plaats van aanroepen naar de functie. Deze techniek kan de prestaties verbeteren door de overhead van functieaanroepen te elimineren, maar kan als gevolg daarvan de geheugenvoetafdruk van de gegenereerde code vergroten. De compiler is echter niet verplicht om de code van de functie inline te genereren, dus als de functie te lang of te complex is, of als de compiler het om de een of andere reden niet kan, wordt een normale functieaanroep gegenereerd. Daarom zeggen we dat inline slechts een hint is voor de compiler.

Door ze samen te voegen, wordt een functie gedefinieerd als beide statisch en inline is er een die onzichtbaar zal zijn buiten het huidige bronbestand, en een waarvan de code zal inline worden gegenereerd, waar u het ook noemt, als de compiler het kan. Deze benadering wordt vaak gebruikt voor zeer kleine, eenvoudige, vaak genoemde interne helperfuncties die geen deel uitmaken van een openbare API.

Antwoord

In het geval van inline-functies, de code in ze worden naar de aanroepfunctie gekopieerd zonder de overhead van de functie-aanroep.

In de kernel wordt het veel gebruikt. Dit wordt doorgaans gedaan als een manier om de prestaties te verbeteren, meer optimalisatie, hoewel niet noodzakelijk het geval.

Het wordt voornamelijk gebruikt voor kleine, tijdkritische functies en we kunnen hierdoor een groot prestatieverschil zien.

Maar zelfs als we geen inline trefwoord gebruiken, kan de compiler proberen om inlining te doen als onderdeel van optimalisatie.

Als vuistregel zouden statische inline-functies in een header moeten staan. Het definieert een inline-functie met interne koppeling. We kunnen dus zeggen dat dergelijke functies lokaal zijn voor een translationele eenheid en er inline in zitten.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *