Tech, szoftvertervezés és programozás

Szoftverfejlesztés, Shaderprogramozás, DirectX

  • A betűméret növelése
  • Alapértelmezett betűméret
  • A betűméret csökkentése
Címlap Programozás Rekurzivitás - elegancia veszélyekkel - A függvényhívás - avagy mi történik a színfalak mögött

Rekurzivitás - elegancia veszélyekkel - A függvényhívás - avagy mi történik a színfalak mögött

E-mail
Olvasóink értékelése: / 0
ElégtelenKitűnő 
Tartalomjegyzék
Rekurzivitás - elegancia veszélyekkel
függvényhívás
Minden oldal

A függvényhívás - avagy mi történik a színfalak mögött

Most, hogy tisztáztuk a veremmemória fogalmát, megvizsgálhatjuk, mi is történik a kulisszák mögött egy függvény hívásakor.
"Egy függvény hívásakor a következõ történik:

  1. a hívott függvény paraméterei bekerülnek a verembe (jobbról-balra haladva a paraméterlistában); A VisualC++ fordítója különbözõ függvényhívási konvenciókat alkalmaz, és elõfordulhat,  hogy verem helyett aC++processzor regisztereit használja, így optimalizálva a paraméterek átadását. A Microsoft-specifikus függvényhívási konvenciókra hamarosan kitérek.
    Megjegyzés
    Ha a függvényparaméterek érték szerint kerülnek átadásra, akkor létrejön róluk egy lokális másolat. Pointer vagy referencia átadása esetén ez nem történik meg, ezért osztály típusú paraméterek esetében megspórolhatjuk az ideiglenes objektum létrehozásával majd megszuntetésével járó - másoló konstruktor illetve destruktor - függvényhívásokat. A cím átadásával azonban lehetõvé válik az objektum módosítása, amit kivédhetünk a const kulcsszóval.
  2. a függvényhívást követő utasítás címe is bekerül a verembe; ezáltal a processzor tudni fogja, hogy a hívott függvényből visszatérve honnan kell folytassa a végrehajtást
  3. a vezérlés a hívott függvény címére ugrik
  4. megtörténik a függvény saját veremterületének felállítása - létrejön az ún. "stack-frame", amire a függvénynek a lokális illetve automatikus változói számára van szüksége
  5. az érték szerint átadott paraméterekből másolatok jönnek létre; ezek a másolatok lokálisak a hívott függvényben, ezért megszűnnek a verem visszafejtése során;
  6. végrehajtódik a függvény kódja
  7. a függvény kódjának végrehajtása után megtörténik a függvény lokális veremterületének visszafejtése; ezt végezheti a hívó vagy a hívott függvény, függvényhívási konvenciótól függõen. Lényeges, hogy a verem visszafejtés végén a verem utolsó eleme a 2. pontban elmentett visszatérési cím legyen - különben a vezérlés nem a megfelelõ helyre kerül, aminek kellemetlen következményei lesznek. Ez szerencsére csak extrém esetekben fordulhat elõ (lásd következõ fejezet), hiszen a verem karbantartását a fordító által generált kód biztosítja."

"A függvényhívás. Függvényhívási konvenciók - mi történik a színfalak mögött" részlet "Gyakorlati C++" című könyvemből

Nyisztor Károly