Mi intrinsiki (intrinsics) verem túlcsordulás az orosz

Itt egy példa a VC ++.

Fordítsuk fogyatékos optimalizálás (/ OD). Ha van #pragma intrinsic (strlen) get

És ennek hiányában -

(Bővebb információ - lehetővé optimalizálása mindkét esetben ugyanaz -







Ie Bizonyos értelemben ez inline-funkció csak egy előre elkészített assembly kód.

C / C ++ bármely szervezet deklarált de nem definiált a forrás fájlt kell tekinteni a külföldi. Ez vonatkozik a funkciók nem kevesebb, mint egy változó. Linkek külső funkciók fordított object fájlt és helyébe fellebbez ezek a szervezetek csak az összekapcsolás során, ha minden inter-modul függőségek teljesülnek. Nincs különbség PrivetVasya () és a printf () - ben mind a fordító teljesen összege mintegy két és akkor azt mondják, hogy „igen, ez csak néhány külső funkciókat.” Amikor a hülye tankönyvek, vagy fél-képzett tanárok kezd beszélni „beépített nyelvi funkció printf ()» (és ez egy nagyon népszerű téveszmék) - meg kell érteni, hogy ez egyszerűen nonszensz, hogy a nyelv a semmit nem épül, a fordító kezeli a hívást a printf () függvényt ugyanolyan feltételekkel, mint egy hívást, hogy bármilyen más funkciót, de legalább a szomszédos értékesítési fájlt. Ami ugyanaz a printf () - ez nem egy beépített nyelvi és szabványos könyvtári funkciót. Szabványos erre függvény írja le a nyelvet, bejelenti a jelenlétét a standard könyvtár, hanem a fordító a standard könyvtár lényegtelen - akkor jelenik meg a színpadon, összekapcsolása, vagy egyáltalán nem jelenik meg.







Mindazonáltal van egy valóban beépített funkciókat. amelyekre a fordító tényleges megvalósítása különleges bánásmód - ezek az úgynevezett belső-s. Különböző fordítóprogramok belső-s más-más. Lényegi-edik függvénye lehet, hogy meg névlegesen él a standard könyvtár. Amikor felhívja a belső funkciók fordító generál egy speciális kódot, amely jellemző erre a funkcióra: nem generál felhívások és nem lesz igazi hívás és a visszatérés, és több utasításokat hajtsa végre a kívánt feladatot. Például egy nagyon gyakori belső memcpy () van összeállítva, hogy nem hívja semmilyen funkciót, és repnz movs utasítás (például x86).

Egyértelmű, hogy a szabványos C könyvtár (libc) AVR vannak olyan jellemzők, amelyek késés. Természetesen ez egy teljes értékű funkciókat benne csavar ciklust. Ha szüksége van egy késés 1-2 ciklus, akkor természetesen az ilyen nehéz a funkció nem használható. Ahhoz, hogy a késedelem 1 órajel ciklus befejeztével (és gyakori) nem működhet akkor is, ha az teljesen üres függvényhívás utasítás végrehajtása 4 óra, és az utasítás ret - 4 vagy több ciklusban, összesen 8 cikluson egy üres függvény hívásával.

Anélkül, hogy a felesleges gondolat világos, hogy a késedelem egységekben ciklusok (kevesebb, mint 8) végrehajtása csak belső-s. És most, drukkolás, hadd kérdezzük: Van az avr-gcc késleltetés funkció (késleltető funkció), amely a belső-és? Valóban van ilyen belső - nevezett funkció __builtin_avr_delay_cycles ().




Kapcsolódó cikkek