Különbség a Call by Value és Call by Reference között
Főbb különbség az érték szerinti hívás és a referencia szerinti hívás között
- A Call by value metódusban az eredeti érték nem módosul, míg a Call by value metódusban az eredeti érték módosul.
- A Call by value esetén a változó egy példányát adjuk át, míg a Call by reference esetén magát a változót.
- A Call by value esetén a tényleges és formális argumentumok különböző memóriahelyeken, míg a Call by reference esetén a tényleges és formális argumentumok ugyanazon a memóriahelyen jönnek létre.
- Az érték szerinti hívás az alapértelmezett módszer olyan programozási nyelvekben, mint pl C++, PHP, Visual Basic NET és C#, míg a Call by reference csak a következőben támogatott Java nyelv.
- A Call by Value változók átadása egyszerű módszerrel történik, míg a Call by Reference mutatók szükségesek a változók címének tárolásához.
A programozási nyelvekben a függvények kétféleképpen hívhatók meg: ez az úgynevezett Call by Value és Call by Reference.
Mi az a Call by Value módszer?
A Call by value metódus bemásolja egy argumentum értékét a függvény formális paraméterébe. Ezért a fő függvény paraméterében végzett változtatások nem befolyásolják az argumentumot.
Ebben a paraméterátadási módszerben a tényleges paraméterek értékeit a függvény formális paramétereibe másolják, és a paramétereket különböző memóriahelyeken tárolják. Így a függvényeken belül végrehajtott változtatások nem tükröződnek a hívó tényleges paramétereiben.
Mi az a Hívás referencia módszerrel?
A hívás hivatkozási módszerrel az argumentum címét a formális paraméterbe másolja. Ebben a módszerben a cím a függvényhívásban használt tényleges argumentum elérésére szolgál. Ez azt jelenti, hogy a paraméterben végrehajtott változtatások megváltoztatják az átadási argumentumot.
Ennél a módszernél a memóriafoglalás megegyezik a tényleges paraméterekkel. A függvény minden művelete az aktuális paraméter címén tárolt értékkel történik, és a módosított érték is ugyanazon a címen kerül tárolásra.
C-kód Példa egy érték szerinti hívásra
void main() { int a = 10, void increment(int); Cout << "before function calling" << a; increment(a); Cout << "after function calling" << a; getch(); void increment(int x) { int x = x + 1; Cout << "value is" << x; }
output:
before function calling 10 value is 11 after function calling 1-0
Mivel az 'a'in main() deklarált változó különbözik az increment() 'x' változótól. Ebben a programban csak a változónevek hasonlóak, de a memóriacímük eltérő, és különböző memóriahelyeken tárolódnak.
Java Kód Példa hívás referencia módszerrel
Public static void main(string args[]) { int a = 10; System.out.println("Before call Value of a = ", a); Void increment(); System.out.println("After call Value of a = ", a); } Void increment(int x) { int x = x + 1; }
output:
Before call Value of a =10 After call Value of a =11
Mivel az 'a' in-ben deklarált változó a main() 'a' változóra hivatkozik/mutat. Itt a változó neve más, de mindkettő ugyanazokra a memóriacímekre mutat/hivatkozik.
Hívás érték szerint vs. Hívás referencia alapján
paraméterek | Hívás érték szerint | Hívás referenciával |
---|---|---|
Meghatározás | Amikor függvény hívásakor változók másolásával ad át értékeket, azt „Call By Values” néven ismerjük. | Függvényhívás közben a programozási nyelvben a változók értékeinek másolása helyett a változók címét használjuk, ezt „Call By References” néven ismerjük. |
érvek | Ennél a módszernél a változó másolatát adják át. | Ebben a módszerben magát a változót adjuk át. |
Hatás | A változó másolatán végrehajtott változtatások soha nem módosítják a függvényen kívüli változó értékét. | A változó változása hatással van a függvényen kívüli változó értékére is. |
Értékváltozás | Nem teszi lehetővé a tényleges változók módosítását. | Lehetővé teszi a változók értékeinek módosítását függvényhívások segítségével. |
Változó átadása | A változók értékeit egyszerű módszerrel adjuk át. | Mutatóváltozókra van szükség a változók címének tárolásához. |
Értékmódosítás | Az eredeti érték nem módosult. | Az eredeti érték módosul. |
Memória helye | Aktuális és formális érvek különbözőben jön létre memóriahely |
Aktuális és formális érvek ugyanabban jön létre memóriahely |
Biztonság | A tényleges érvek maradnak biztonságosak, mivel nem módosíthatók véletlenül. |
A tényleges érvek nem Biztonságos. Lehetnek véletlenül módosult, ezért óvatosan kell kezelnie az argumentumműveleteket. |
alapértelmezett | Alapértelmezett sok programozásban nyelvek, mint C++.PHP. Visual Basic NET és C#. |
A legtöbben támogatják programozási nyelvek, mint a JAVA, de nem alapértelmezés szerint. |
A Call by value metódus használatának előnyei C-ben
A C-beli érték szerinti hívás előnyei/előnyei:
- A metódus nem változtatja meg az eredeti változót, tehát megőrzi az adatokat.
- Amikor egy függvényt hívnak, soha ne befolyásolja az aktuális argumentumok tényleges tartalmát.
- A tényleges érvek értéke átkerült a formális argumentumokhoz, így a formális argumentumban végrehajtott változtatások nem befolyásolják a valós eseteket.
A Hívás referenciamódszer használatának előnyei
A referencia módszerrel történő hívás előnyei:
- A függvény megváltoztathatja az argumentum értékét, ami nagyon hasznos.
- Nem hoz létre duplikált adatokat egyetlen érték tárolására, ami segít memóriaterület megtakarításában.
- Ennél a módszernél nincs másolata az elhangzott érvnek. Ezért nagyon gyorsan feldolgozzák.
- Segít elkerülni a véletlenül végrehajtott változtatásokat
- A kódot olvasó személy soha nem tudja, hogy az érték módosítható a függvényben.
A Call by value módszer használatának hátrányai
Íme az értékmódszer szerinti hívás főbb hátrányai/hátrányai:
- A tényleges paraméterek módosítása a megfelelő argumentumváltozókat is módosíthatja
- Ebben a módszerben az argumentumoknak változóknak kell lenniük.
- A függvénytörzsben lévő változót nem lehet közvetlenül megváltoztatni.
- Az argumentum néha összetett kifejezések is lehetnek
- Két másolat készült ugyanarról a változóról, amely nem memóriatakarékos.
A Hívás referenciamódszer használatának hátrányai
Íme a hívás referencia-módszer használatának fő hátrányai:
- Erős, nem semmis garancia. A hivatkozást felvevő függvénynek meg kell győződnie arról, hogy a bemenet nem nulla. Ezért nem kell null ellenőrzést végezni.
- A hivatkozáson keresztüli átadás a függvényt elméletileg nem tiszta.
- Az élethosszig tartó garancia nagy probléma a referenciákkal. Ez különösen veszélyes, ha lambdákkal és többszálú programokkal dolgozik.