Skillnaden mellan Call by Value och Call by Reference
Nyckelskillnad mellan Call by Value och Call by Reference
- I Call by value-metoden ändras inte det ursprungliga värdet, medan det ursprungliga värdet ändras i Call by reference-metoden.
- I Call by value skickas en kopia av variabeln, medan i Call by reference skickas en variabel själv.
- I Call by value kommer faktiska och formella argument att skapas på olika minnesplatser, medan i Call by reference skapas faktiska och formella argument på samma minnesplats.
- Call by value är standardmetoden i programmeringsspråk som C++, PHP, Visual Basic NET och C#, medan Call by reference endast stöds i Java språk.
- Call by Value-variabler skickas med en enkel metod, medan Call by Reference-pekare krävs för att lagra adressen till variabler.
I programmeringsspråk kan funktioner anropas på två sätt: vilket är känt som Call by Value och Call by Reference.
Vad är Call by Value-metoden?
Call by value-metoden kopierar värdet av ett argument till den formella parametern för den funktionen. Därför påverkar ändringar som görs av parametern för huvudfunktionen inte argumentet.
I denna parameteröverföringsmetod kopieras värden för faktiska parametrar till funktionens formella parametrar, och parametrarna lagras på olika minnesplatser. Så alla ändringar som görs inuti funktioner återspeglas inte i faktiska parametrar för den som ringer.
Vad är Call by Reference-metoden?
Call by reference-metoden kopierar adressen till ett argument till den formella parametern. I denna metod används adressen för att komma åt det faktiska argumentet som används i funktionsanropet. Det betyder att ändringar som görs i parametern ändrar det godkända argumentet.
I denna metod är minnesallokeringen densamma som de faktiska parametrarna. Alla operationer i funktionen utförs på värdet lagrat på adressen för den aktuella parametern, och det ändrade värdet kommer att lagras på samma adress.
C-kod Exempel på en Call by Value-metod
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; }
Produktion:
before function calling 10 value is 11 after function calling 1-0
Eftersom variabel deklarerad 'a'in main() skiljer sig från variabel 'x' i inkrement(). I detta program är endast variabelnamn lika, men deras minnesadress är olika och lagras på olika minnesplatser.
Java Kodexempel på en Call by Reference-metod
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; }
Produktion:
Before call Value of a =10 After call Value of a =11
Eftersom variabel deklarerad 'a' i refererar/pekar till variabel 'a' i main(). Här är variabelnamnet olika, men båda pekar/refererar till samma minnesadressplatser.
Call by Value vs Call by Reference
Driftparametrar | Ring efter värde | Ring med referens |
---|---|---|
Definition | När du anropar en funktion, när du skickar värden genom att kopiera variabler, kallas den "Call By Values". | När du anropar en funktion, i programmeringsspråk istället för att kopiera värdena för variabler, används adressen till variablerna, den kallas "Call By References. |
Argument | I denna metod skickas en kopia av variabeln. | I denna metod skickas en variabel själv. |
Effekt | Ändringar som görs i en kopia av variabel ändrar aldrig värdet på variabel utanför funktionen. | Ändring i variabeln påverkar även värdet på variabeln utanför funktionen. |
Värdeförändring | Tillåter inte att du gör några ändringar i de faktiska variablerna. | Låter dig göra ändringar i variablernas värden genom att använda funktionsanrop. |
Passering av variabel | Variablers värden skickas med en enkel metod. | Pekarvariabler krävs för att lagra adressen till variabler. |
Värdeförändring | Ursprungligt värde inte ändrat. | Det ursprungliga värdet ändras. |
Minnesplats | Faktiska och formella argument kommer att skapas i olika minnesplats |
Faktiska och formella argument kommer att skapas i samma minnesplats |
Säkerhet | Faktiska argument kvarstår säkra eftersom de inte kan modifieras av misstag. |
Faktiska argument är det inte Säker. De kan vara ändras av misstag, så du måste hantera argumentoperationer noggrant. |
Standard | Standard i många programmeringar språk som C++.PHP. Visual Basic NET och C#. |
Det stöds av de flesta programmeringsspråk som JAVA, men inte som standard. |
Fördelar med att använda Call by value-metoden i C
Fördelar/fördelar med ett samtal efter värde i C:
- Metoden ändrar inte den ursprungliga variabeln, så den bevarar data.
- Närhelst en funktion kallas den, påverka aldrig det faktiska innehållet i de faktiska argumenten.
- Värdet av faktiska argument som överförs till de formella argumenten, så eventuella ändringar som görs i det formella argumentet påverkar inte de verkliga fallen.
Fördelar med att använda Call by reference-metoden
Fördelar med att använda call by reference-metoden:
- Funktionen kan ändra värdet på argumentet, vilket är ganska användbart.
- Det skapar inte dubbletter av data för att bara hålla ett värde vilket hjälper dig att spara minnesutrymme.
- I denna metod finns det ingen kopia av argumentet. Därför bearbetas det mycket snabbt.
- Hjälper dig att undvika ändringar gjorda av misstag
- En person som läser koden vet aldrig att värdet kan ändras i funktionen.
Nackdelar med att använda Call by value-metoden
Här är stora nackdelar/nackdelar med en call by value-metod:
- Ändringar av faktiska parametrar kan också ändra motsvarande argumentvariabler
- I denna metod måste argument vara variabler.
- Du kan inte direkt ändra en variabel i en funktionskropp.
- Ibland kan argument vara komplexa uttryck
- Det finns två kopior skapade för samma variabel som inte är minneseffektiva.
Nackdelar med att använda Call by reference-metoden
Här är de stora nackdelarna med att använda call by reference-metoden:
- Stark icke-nullgaranti. En funktion som tar in en referens måste se till att ingången inte är noll. Därför behöver ingen nollkontroll göras.
- Att passera genom referens gör att funktionen inte är rent teoretiskt.
- Livstidsgaranti är ett stort problem med referenser. Detta är särskilt farligt när man arbetar med lambdas och flertrådade program.