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.

Különbség a Call by Value és Call by Reference között

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.