Rozdíl mezi Call by Value a Call by Reference

Klíčový rozdíl mezi voláním podle hodnoty a voláním podle reference

  • U metody Call by value se původní hodnota nemění, zatímco u metody Call by reference se původní hodnota upravuje.
  • V Call by value je předána kopie proměnné, zatímco v Call by reference je předána samotná proměnná.
  • V Call by value budou skutečné a formální argumenty vytvořeny v různých paměťových místech, zatímco v Call by reference budou skutečné a formální argumenty vytvořeny ve stejném paměťovém místě.
  • Volání podle hodnoty je výchozí metoda v programovacích jazycích jako C++, PHP, Visual Basic NET a C#, zatímco volání podle reference je podporováno pouze v Java Jazyk.
  • Proměnné Call by Value se předávají přímou metodou, zatímco ukazatele Call by Reference jsou nutné k uložení adresy proměnných.

Rozdíl mezi Call by Value a Call by Reference

V programovacích jazycích lze funkce vyvolávat dvěma způsoby: což je známé jako volání podle hodnoty a volání podle reference.

Co je metoda Call by Value?

Metoda Call by value zkopíruje hodnotu argumentu do formálního parametru této funkce. Proto změny provedené v parametru hlavní funkce nemají vliv na argument.

Při této metodě předávání parametrů jsou hodnoty skutečných parametrů zkopírovány do formálních parametrů funkce a parametry jsou uloženy v různých paměťových místech. Jakékoli změny provedené uvnitř funkcí se tedy neprojeví ve skutečných parametrech volajícího.

Co je metoda Call by Reference?

Call by reference method zkopíruje adresu argumentu do formálního parametru. V této metodě se adresa používá pro přístup ke skutečnému argumentu použitému ve volání funkce. To znamená, že změny provedené v parametru mění předávaný argument.

V této metodě je alokace paměti stejná jako skutečné parametry. Všechny operace ve funkci se provádějí s hodnotou uloženou na adrese aktuálního parametru a upravená hodnota bude uložena na stejnou adresu.

C kód Příklad metody Call by Value

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;
        }

Výstup:

before function calling 10
value is 11
after function calling 1-0

Protože proměnná deklarovaná 'a'in main() se liší od proměnné 'x' v increment(). V tomto programu jsou pouze názvy proměnných podobné, ale jejich paměťové adresy jsou různé a jsou uloženy v různých paměťových místech.

Java Příklad kódu metody Call by Reference

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;
}

Výstup:

Before call Value of a =10
After call Value of a =11

Protože proměnná deklarovaná 'a' in odkazuje/ukazuje na proměnnou 'a' v main(). Zde je název proměnné jiný, ale obě směřují/odkazují na stejné adresy paměti.

Call by Value vs. Call by Reference

parametry Volat podle hodnoty Volejte odkazem
Definice Když při volání funkce předáváte hodnoty kopírováním proměnných, je to známé jako „volání podle hodnot“. Při volání funkce se v programovacím jazyce místo kopírování hodnot proměnných používá adresa proměnných, která se nazývá „Call By References“.
Argumenty Při této metodě se předává kopie proměnné. V této metodě se předává samotná proměnná.
Účinek Změny provedené v kopii proměnné nikdy nemění hodnotu proměnné mimo funkci. Změna proměnné také ovlivňuje hodnotu proměnné mimo funkci.
Změna hodnoty Neumožňuje provádět žádné změny ve skutečných proměnných. Umožňuje provádět změny v hodnotách proměnných pomocí volání funkcí.
Předávání proměnné Hodnoty proměnných jsou předávány přímočarou metodou. Proměnné ukazatele jsou nutné k uložení adresy proměnných.
Úprava hodnoty Původní hodnota nezměněna. Původní hodnota je upravena.
Umístění paměti Skutečné a formální argumenty
budou vytvořeny v různých
paměťové místo
Skutečné a formální argumenty
budou vytvořeny ve stejném
paměťové místo
Bezpečnost Skutečné argumenty zůstávají
bezpečné, protože je nelze upravovat
náhodou.
Skutečné argumenty nejsou
Bezpečný. Oni mohou být
náhodně upraveno, takže s operacemi s argumenty musíte zacházet opatrně.
Automaticky Výchozí v mnoha programování
jazyky jako C++.PHP. Visual Basic NET a C#.
Podporuje to většina
programovací jazyky jako JAVA, ale
ne jako výchozí.

Výhody použití metody Call by value v C

Výhody/přínosy hovoru podle hodnoty v C:

  • Metoda nemění původní proměnnou, takže zachovává data.
  • Kdykoli je funkce volána, nikdy neovlivní skutečný obsah skutečných argumentů.
  • Hodnota skutečných argumentů předaná formálním argumentům, takže jakékoli změny provedené ve formálním argumentu neovlivní skutečné případy.

Výhody použití metody Call by reference

Výhody použití metody volání podle reference:

  • Funkce může změnit hodnotu argumentu, což je docela užitečné.
  • Nevytváří duplicitní data pro uložení pouze jedné hodnoty, což vám pomáhá šetřit místo v paměti.
  • V této metodě neexistuje žádná kopie provedeného argumentu. Proto se zpracovává velmi rychle.
  • Pomáhá vám vyhnout se změnám provedeným omylem
  • Osoba, která čte kód, nikdy neví, že hodnotu lze ve funkci upravit.

Nevýhody použití metody Call by value

Zde jsou hlavní nevýhody/nevýhody metody volání podle hodnoty:

  • Změny skutečných parametrů mohou také upravit odpovídající proměnné argumentů
  • V této metodě musí být argumenty proměnné.
  • Nemůžete přímo změnit proměnnou v těle funkce.
  • Někdy argument může být složitý výraz
  • Existují dvě kopie vytvořené pro stejnou proměnnou, která není efektivní z hlediska paměti.

Nevýhody použití metody Call by reference

Zde jsou hlavní nevýhody použití metody volání podle reference:

  • Silná nenulová záruka. Funkce přijímající odkaz se musí ujistit, že vstup není nulový. Proto není třeba provádět nulovou kontrolu.
  • Díky předání odkazem není funkce teoreticky čistá.
  • Doživotní záruka je velký problém s referencemi. To je zvláště nebezpečné při práci s lambda a vícevláknovými programy.