Mikor kell cím szerinti paraméterátadást használni?
Nincs olyan, hogy cím szerinti paraméterátadás. C-ben csak érték szerinti volt, C++-ban pedig csak úgymond inicializálás szerinti paraméterátadás van.
Amúgy amire gondolsz azt két esetben használjuk: ha nem lenne hatékony lemásolni az objektumot vagy ha kimenő paraméterként akarod használni.
Paraméter átadáskor a paramétereket vagy regiszterekben adjuk át, vagy a veremben helyezzük el őket. Regiszterek esetében a regiszterek állapotát el kell menteni, majd hívás után vissza kell állítani. Veremben történő átadás esetén pedig a vermet kell visszaállítani, azaz ugyan annyi méretű adatot kell kivenni (pop), mint amennyit a hívó fél belehelyezett (push).
Elméletileg két féle paraméter átadás lehetséges, aszerint, hogy az átadott paramétereket ki törli (szabadítja fel). Az x86 ararchitektúrán a következő konvenciók vannak:
A hívó fél szabadítja fel:
* cdecl (A C nyelv konvenciója, verem alapú.)
* syscall (OS/2 API konvenciója, cdecl alapú.)
* optlink (IBM fordítók konvenciója, az első három paraméter az EAX, ECX és EDX regiszterekben van, a többi a veremben.)
A hívott fél szabadítja fel:
* pascal (Olyan mint a cdecl csak fordított sorrendben adja át.)
* register (Néhány Linux kernel és Borland nyelvek konvenciója, az optlink megoldást követi.)
* stdcall (MS Win32 API sajátja.)
* fastcall (gyors de platformfüggő.)
* safecall (Delphi-s stdcall megoldás.)
Bármelyik fél felszabadíthatja:
* thiscall ( A C++ nem statikus metódus hívásainál használják, GCC fordító esetén cdecl-el ekvivalens. MS VC++ esetén a this pointer az ECX regiszterbe kerül, és a hívott szabadít vel.)
Ahogy látod, paraméter átadáskor a paraméterben átadott változó értéke mindig lemásolódik, azaz a hívott szubrutin (függvény) nem az eredeti változón operál. Ha egy függvény módosítja a paraméterben megkapott változóját, az nincs hatással az hívó fél hatáskörében használt (átadott) változó értékével.
A cím szerinti paraméterátadás arra való, hogy a paraméterben átadott változót, vagy objektumot módosítani tudjuk. Ezt úgy érjük el, hogy nem magát a változó értékét adjuk át, hanem azt a memóriacímet ahol a változó található. Ezt a címet felhasználva módosítani tudjuk ez eredeti változó értékét. A függvény hívás végén, a hívó hatáskörében az átadott változó így változhat.
C++ esetén van lehetőség referencia szerinti paraméterátadásra is. Ez nagyon hasonlít a cím szerinti átadásra, de valamivel biztonságosabb. Ennek oka, hogy egy referencia (a Java-s és C#-os terminológiával ellentétben) mindig egy objektumra mutat. A C++ nyelvben nincs null referencia.
Köszönöm mindenkinek!
Utolsó: köszi a részletes magyarázatot, így már szerintem értem:D
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!