Gcc inline-funkció működik olyan gyorsan mint egy makró, avr, programozás

A beágyazott (inline) függvény, akkor utasíthatja GCC hogy függvényhívásokkal gyorsabb. Az egyik módja, amelyben a GCC lehet elérni ezt - beilleszteni a kódot a funkciója a test az a hely, ahol a függvény kerül meghívásra. Úgy feldolgozása gyorsabb processzor, mert megszünteti a költségek egy függvény hívás befejezése és visszatérés belőle. Továbbá, ha az aktuális argumentumok a függvény konstans, az ismert értékeket lehet figyelembe venni fordításkor, ahol lehet építeni nem minden szervezet funkcióit. Az eredmény az lesz, hogy a kód mérete kevésbé kiszámítható; tárgykód- növelheti vagy csökkentheti a használata beágyazott függvények függően minden esetben. Azt is megadhatja, hogy a GCC megpróbál beilleszkedni minden „elég egyszerű” funkciók helyett a hívást, ha használja a lehetőséget -finline funkciók. Itt fordításai cikkek [1, 2].

GCC végrehajtja 3 különböző szemantikai nyilvánító inline-funkciókat. Egyikük áll azzal a lehetőséggel -std = gnu89 vagy -fgnu89-inline, vagy ha van egy attribútum minden inline-nyilatkozatokat, a másik lehetőségek használatával -std = C99, -std = c11, -std = gnu99 vagy -std = gnu11 ( nélkül -fgnu89-inline), és egy harmadik egy C ++ összeállítás módban.

Ahhoz, hogy állapítsa meg a beépített funkció használatához a nyilatkozatban a kulcsszó inline, valahogy így:

Ha írunk egy header file, plug-in ISO C90 programok helyett a kulcsszó inline használat __inline__ (a részleteket lásd. Box "cseréje kulcsszavak").

Módszer razrulit ezeket a kérdéseket - tette „__” az elején és a végén minden kulcsszó problematikus. Például, ahelyett, hogy a __asm__ ASM, és __inline__ helyett inline.

Más C fordító nem fogadja el ezeket az alternatív kulcsszavak; Ha azt szeretnénk, hogy lefordítani kódját más fordító, akkor meghatározhatja alternatív kulcsszavak makrók helyettesíteni őket egyéni kulcsszavakat. Ez valahogy így néz ki:

Opció -pedantic és mások vezetnek figyelmeztetések sok kiterjesztés GNU C lehet letiltani ezeket a figyelmeztetéseket egy kifejezésben írásban __extension__ előtt a kifejezés. Expression __extension__ nem lesz hatása, ha azt a rossz kontextusban.

E három integrációs így viselkedik a két fontos esetekben: amikor az inline kulcsszót használják a (statikus) függvény hasonló a fenti példa, és amikor a funkció először nyilvánították nélkül a kulcsszó inline, majd definiáljuk inline, mint ez :

Mindkét esetben, a program ugyanúgy viselkednek, mint ha nem használja a kulcsszó inline, kivéve, hogy megváltoztatja a végrehajtási sebesség.

Felhívjuk figyelmét, hogy néhány használat bizonyos funkciók lehetetlenné teszik a soros helyettesítés. Például: variadic-funkció (függvény, változó számú argumentuma), használat ALLOCA használt kiszámított goto (lásd a keretes „Címkék értékek”.) A nem-helyi goto használatával beágyazott (nested) funkciók használatához setjmp használja __builtin_longjmp és használata __builtin_return vagy __builtin_apply_args. Opció -Winline jelezze a helyzeteket, amikor a funkció van megjelölve inline, de nem lehet elérni beágyazást, és azt is az oka ennek.

Ahhoz, hogy ezt az értéket, akkor kell, hogy az átmenet számára. Ezt a kiszámított átmeneti üzemeltető (kiszámított Goto), Goto * exp; (1). Például:

Megengedett bármilyen kifejezés típusa: void *.

Az egyik módja, hogy használja ezeket az állandókat - inicializálása statikus tömb, amely kezelni ugrás tábla:

Ezután kiválaszthatja a címkét az index, mint ez:

Megjegyzendő, hogy ez nem történhet ellenőrzésével túlmutat az index a tömb C sohasem automatikusan történik.

Egy ilyen tömb címkeértékekre használjuk ugyanarra a célra, mint az üzemeltető kapcsolót. Azonban a kapcsoló világosabb olvasni, ezért mindig használja, ahelyett, hogy egy tömb címkék, kivéve azokat az eseteket, amikor a kapcsoló nem alkalmas az alkalmazás.

Egy másik használata címkeértékekre - tolmácsa in-line kódot. Címkék belül shell funkciók tárolhatók a fluxus kódot ultragyors elágazást.

Egy másik módja, hogy írjon az előző példában:

Ez a kód inkább felhasználóbarát használatra megosztott könyvtárakat, mivel ez csökkenti a szükséges mozgások, és így lehetővé teszi a használatát csak olvasható adatok. Ez az alternatíva a különbség a címkék nem támogatja az AVR processzor használja az első lehetőséget biztosít számukra.

Amint azt a szabványos ISO C ++, mondta a GCC funkciók - az osztály tagjai (azaz a meghatározott feladatok az osztály test ..) Jelzett szövegközi, akkor is, ha kifejezetten nem nyilvánították a kulcsszó inline. Felülbírálhatja ezt a viselkedést az -fno-default-inline opció (a részleteket lásd. Leírás lehetőséget, hogy ellenőrizzék a nyelvjárás C ++ [3]).

GCC nem ágyazza bármilyen funkciót, amikor nem történik optimalizálás, kivéve, ha az Ön által megadott always_inline attribútum függvényében, mint ez:

A fennmaradó E szakasz beépülésére utal GNU C90.

Amikor az inline-funkció nem statikus (nem statikus attribútumok), akkor a fordító kell érteni, hogy ott is végbemehet hívásokat más forrás fájlokat; mivel a globális szimbólum lehet meghatározni csak egy helyen a programban, ez a funkció nem meghatározható más forrás fájlokat, így a függvény hívások nem építhető. Így a nem statikus függvény mindig össze a kiválasztott kódot, a szokásos módon.

Ez a kombináció inline és extern ad a makro hatása. Használja módszer - tegye a függvény definíciójában ezekkel a kulcsszavakkal a header fájlban, és helyezzük egy másik példányát a meghatározás (anélkül, hogy inline és extern) egy könyvtár fájl. Definíció a header fájlban hatására a legtöbb hívást a funkció kerül kialakításra. Ha van olyan funkciók használatának, hogy vonzó lesz rá, mint egy-egy példányban a könyvtárban.

[Beépített funkció a C nyelvben keretében hordozhatóságát kód]

Azon a ponton, az alkalmazás a beágyazott fordító funkció egy csipetnyi, hogy meg kell, hogy bizonyos intézkedéseket annak érdekében, hogy hívja a funkció gyorsabb, mint akkor lett volna rendesen. Leggyakrabban ezek a lépések állnak az a tény, hogy a helyén a felhívás fogja helyettesíteni a függvény törzsében anélkül, hogy hívást az üzemeltető. Mert ha ez a helyettesítés nem szükséges utasítást (CALL) és (RET), és nem szükséges, hogy a verem lokális változók és regiszter van, ez adja a fordító, hogy végre bizonyos optimalizációt kódok kombinálása során funkciók és a fő program.

Számos módja van, hogy meghatározza az inline függvények; minden létező nézet meghatározása minden bizonnyal létrehoz egy önálló objektum kód vagy egyáltalán nem generál egy önálló tárgyi kód generálására vagy egy önálló objektum kód csak akkor, ha tudja, hogy szüksége van rá. Néha ez ahhoz vezethet, hogy a párhuzamos tárgykód, amely egy lehetséges probléma az alábbi okok miatt:

• az elvesztegetett memória.
• vezethet, hogy a mutató ugyanazt a funkciót nem egyenlő egymással.
• hatásosságát csökkentheti az utasítás cache (bár behelyezés is elvégezhető más módon).

Ha az alábbiak közül bármelyik is problémát jelent, akkor a stratégia, hogy megkerülje a párhuzamos kódot. Ez csak egy a cikkben tárgyalt.

Kevesebb fordítás üzleti egység megérteni külön modul (fájl) forráskódot C. statikus funkciók és statikus változók speciális szabályok hatálya vonatkozik a sugárzott egységet.

[Soros szabályok szabvány C99]

1. A funkció, amelynek során valamennyi, a nyilatkozat (beleértve a definíciókat) címkével inline és sohasem extern. Ez belül kell definiálni egyetlen fordítási egység (fordítási egység). A szabvány ezt a lehetőséget, mint egy inline felbontású (inline definíció). Nem lesz önálló objektum kód keletkezik, így ez a meghatározás nem nevezhető egy másik egység adás (más modul).

Akkor (2) külön (nem inline) meghatározása azonos funkciót egy másik fordítási egységben, a fordító tudja választani külön meghatározás vagy inline-meghatározás.

Ezek a funkciók nem tartalmazza a módosítható statikus változók, és nem tud hozzáférni a statikus definíciók, illetve funkciók forrás fájlt (t. E., nem ott, ahol az inline függvények nyilvánítják).

Ebben a példában minden nyilatkozatok és használt definíciók inline, de ne használjon extern:

Ez a funkció nem nevezhető más fájlokat; Ehelyett egy másik fájlban kell saját meghatározás.

(2) megjegyzés: a szabvány nincs egyértelmű leírását. Azt mondja, hogy az inline-meghatározás nem tiltja a külső (külső) meghatározás máshol, de akkor alternatívát nyújt a külső definíciókat. Sajnos, ez nem ad világos megértése - amennyiben azt ténylegesen létezik a meghatározás. A gyakorlatban, ha nem tűzte ki, hogy kínozza a fordító, akkor ott lesz a következő szabály: ha meg akarja menteni a beépített függvény teljesen magán egy egységnyi fordítás, csináld definiált statikus beépített.

2. Funkció, ahol legalább egy nyilatkozatot jelölve inline, de ahol más nyilatkozatok nem beszélve inline, vagy nevezzük extern. Funkciójának meghatározása legyen az azonos broadcast yunite ezt a nyilatkozatot. önálló tárgy kódot generál (mint a normális működéshez), és fel lehet hívni más egységek sugárzott a program.

Azt is használják, hogy korlátozza a statikus definíció már említettük.

Ebben a példában minden nyilatkozatok és használt definíciók inline, de az egyik hozzáteszi extern:

Ebben a példában az egyik nyilatkozatok nem jelölt sorok között:

A fenti két példa, a funkció hívható más fájlokat.

3. A függvény definíciója a statikus soron belül. helyi definíció lehet kiadni, ha szükséges. Egyszerre több meghatározásai adás sugárzása a különböző egységeket és ezek mind működnek különálló feladat. Egyszerűen öntsük inline csökkenti a hordozhatóság programok (ismét ceteris paribus).

Ez hasznos lehet, kisebb rendezvények, amelyek egyébként definiált makrók. Ha ez a funkció nem mindig épült, akkor kap egy másolatot a kód az összes már fent leírt problémákat.

Egy értelmes megközelítés lenne, hogy tegyen egy statikus beépített funkciója a header fájlt, vagy ha meg kell széles körben használják, vagy egyszerűen csak a forráskód fájlokat használjuk azokat a funkciókat - ha valaha ebben a fájlban.

Ebben a példában, a funkció határozza meg, mint egy statikus beépített:

Az első két lehetőség természetesen kombinálhatók. Te vagy minden inline és extern egy helyen önálló meghatározása a lekérdezés, vagy írjon inline szinte mindenhol, de kihagyja szükségesnek egyszer, hogy egy autonóm meghatározás.

A fő funkciója nem ágyazható (inline) függvény.

(C ++ szigorúbb szabályokat: olyan funkció, amely megjelent valahol, mint inline, amennyiben minden definiálható inline, és meg kell határozni ugyanúgy minden egységében fordítást, ha azt használják.)

[Inline szabályok GNU C fordító]

1. függvény inline saját. Mindig saját előállítású tárgyi kód. Írhatsz csak egy definíció, mint ez az egész programot. Ha szeretné használni a más egységek fordítás, helyezze a nyilatkozatot a header fájlban; de ez nem teszi integrációját a broadcast modulok, ahol a fejléc használják.

Ez a lehetőség csak korlátozott mértékben használható, ha azt szeretné, hogy egy funkció egy yunite fordítás, hogy több értelme, hogy ez statikus beépített, amint azt a 3. lehetőség - ha esetleg nem szeretné, hogy olyan formában, amely lehetővé teszi a funkciók beépített egység egynél több adás.

Azonban ez a lehetőség a használata inline kulcsszó nak megvan az az előnye a program csökken a hordozható program ugyanazt az értéket (ha nem használ semmilyen más, nem hordozható kivitelben).

2. A funkció, definiált extern inline. Önálló tárgykód nem keletkezik valaha. Egyszerre több ilyen meghatározások és a program még mindig működik. Ugyanakkor azt is hozzá kell adni valahol, és nem-inline meghatározása abban az esetben működnek valahol nem használják inline.

Ez egy elfogadható szemantika (lehetséges, hogy elkerüljék a párhuzamos a tárgykód funkciók), de egy kicsit kényelmetlen a használata.

Az egyik módja, hogy használja ezt a lehetőséget - tegye a meghatározások a header fájlban, térhatású szereplő előfeldolgozó #ha, amely értékelni fogják, hogy igaz, vagy ha a GNU C, vagy ha a fejléc van kötve egy fájlt, amely a meghatározás ki (függetlenül attól, hogy a GNU C ). Az utóbbi esetben extern elhagyható (például EXTERN írási, és ez határozza meg a #define extern akár, vagy egy void). #else ág tartalmazna egy nyilatkozatot funkciók nem GNU fordító.

3. A funkció definiált statikus beépített. Ha szükséges, egy önálló tárgy kódot generál. Egyszerre több meghatározásai adás sugárzása a különböző egységek, és működni fog. Ez ugyanaz a verzió a felismerés, hogy a C99 szabályokat.

A kibocsátás 4,3 GNU C fordító támogatja C99 beépülés szabályokat, a fent leírtak szerint, és ezeket használja alapértelmezett opciókkal -std = C99 vagy -std = gnu99. A régi szabályok lehet kérni az új fordító opció -gnu89-inline, vagy a gnu_inline funkció attribútumot.

Ha C99 olyan szabályok, amelyek meghatározzák a GCC __GNUC_STDC_INLINE__ makró. Kezdve GCC 4.1.3 a makro __GNUC_GNU_INLINE__, ha csak a használt GCC szabályok, de a régi fordítóprogramok használja ugyanazt a szabályok betartása nélkül bármilyen makrót. Kijavítja a helyzetben egy darab a következő kódot:

[Stratégiák alkalmazásával inline-funkciók]

Az alábbi szabályok azt tanácsolják, hogy lehetséges modellek használatára inline-funkciók, többé-kevésbé befolyásolja a hordozhatóság.

Például a header fájlban:

Akkor támogatják a hagyományos fordítóprogramok (pl nem inline) keresztül -Dinline = opció „” bár ez vezet a memória elvesztése, ha a fordító nem optimalizálják a fel nem használt funkciókat.

GNU C típus használata extern inline általános header fájlt, és így a meghatározás valahol a .c fájlt, esetleg egy makro -, hogy biztosítsák a megjelenése mindenütt ugyanazt a kódot. Például a header fájlban:

és adja meg egyetlen forráskód file:

C99 modellt. Használja inline általános header fájlt, és az a meghatározás valahol a .c fájlt, a nyilatkozat extern. Például egy header file:

és csak egy néhány forráskód file:

Támogatást adni régebbi fordítóprogramok, meg kell fizetnie az összes ezt a kódot a előfeldolgozó, hogy a nyilatkozatot lehetett látni a közös gyűjtő és meghatározás arra korlátozódik egy üzleti egység a fordítást, amely a funkció határozza meg a soron belül.

Komplex modell számhordozás. Használjon egy makrót, hogy kiválassza a meghatározás vagy a extern inline GNU C, inline a C99, vagy anélkül is. Például a fejlécben:

és csak egy forráskód file:

Támogatjuk örökölt fordítóprogramok ugyanazokkal a problémákkal, mint a GNU C modell

1. Soros funkciókat C site: greenend.org.uk.
2. Az Inline funkció olyan gyors, mint a makró site: gcc.gnu.org.
3. Lehetőség Controlling C ++ Dialect site: gcc.gnu.org.