Forskjellen mellom Call by Value og Call by Reference
Nøkkelforskjell mellom Call by Value og Call by Reference
- I Call by value-metoden endres ikke den opprinnelige verdien, mens den opprinnelige verdien endres i Call by reference-metoden.
- I Call by value sendes en kopi av variabelen, mens i Call by reference sendes en variabel i seg selv.
- I Call by value vil faktiske og formelle argumenter bli opprettet på forskjellige minneplasseringer, mens i Call by reference vil faktiske og formelle argumenter bli opprettet på samme minneplassering.
- Call by value er standardmetoden i programmeringsspråk som C++, PHP, Visual Basic NET og C#, mens Call by reference kun støttes i Java Språk.
- Call by Value-variabler sendes ved hjelp av en enkel metode, mens Call by Reference-pekere kreves for å lagre adressen til variabler.
I programmeringsspråk kan funksjoner påkalles på to måter: som er kjent som Call by Value og Call by Reference.
Hva er Call by Value-metoden?
Call by value-metoden kopierer verdien av et argument inn i den formelle parameteren til den funksjonen. Derfor påvirker ikke endringer i parameteren til hovedfunksjonen argumentet.
I denne parameteroverføringsmetoden kopieres verdiene til faktiske parametere til funksjonens formelle parametere, og parameterne lagres på forskjellige minneplasseringer. Så eventuelle endringer som er gjort inne i funksjoner, gjenspeiles ikke i faktiske parametere til den som ringer.
Hva er Call by Reference-metoden?
Call by reference-metoden kopierer adressen til et argument inn i den formelle parameteren. I denne metoden brukes adressen for å få tilgang til det faktiske argumentet som brukes i funksjonskallet. Det betyr at endringer gjort i parameteren endrer bestått argument.
I denne metoden er minneallokeringen den samme som de faktiske parameterne. All operasjon i funksjonen utføres på verdien som er lagret på adressen til den faktiske parameteren, og den endrede verdien vil bli lagret på samme adresse.
C-kode Eksempel på en Call by Value-metode
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; }
Utgang:
before function calling 10 value is 11 after function calling 1-0
Fordi variabel deklarert 'a'in main() er forskjellig fra variabel 'x' i inkrement(). I dette programmet er bare variabelnavn like, men minneadressen deres er forskjellig og lagret på forskjellige minneplasseringer.
Java Kodeeksempel på en Call by Reference-metode
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; }
Utgang:
Before call Value of a =10 After call Value of a =11
Fordi variabel deklarert 'a' i refererer/peker til variabel 'a' i main(). Her er variabelnavnet forskjellig, men begge peker/refererer til samme minneadresseplasseringer.
Ring etter verdi vs. Ring etter referanse
Parametre | Ring etter verdi | Ring ved referanse |
---|---|---|
Definisjon | Når du kaller en funksjon, når du sender verdier ved å kopiere variabler, er den kjent som "Call By Values." | Mens du kaller en funksjon, i programmeringsspråk i stedet for å kopiere verdiene til variabler, brukes adressen til variablene, den er kjent som "Call By References. |
argumenter | I denne metoden sendes en kopi av variabelen. | I denne metoden sendes en variabel i seg selv. |
Effekt | Endringer gjort i en kopi av variabel endrer aldri verdien til variabel utenfor funksjonen. | Endring i variabelen påvirker også verdien av variabelen utenfor funksjonen. |
Endring av verdi | Tillater deg ikke å gjøre noen endringer i de faktiske variablene. | Lar deg gjøre endringer i verdiene til variabler ved å bruke funksjonskall. |
Passering av variabel | Verdier av variabler sendes ved hjelp av en enkel metode. | Pekervariabler kreves for å lagre adressen til variabler. |
Verdimodifisering | Opprinnelig verdi ikke endret. | Den opprinnelige verdien er endret. |
Minneplassering | Faktiske og formelle argumenter vil bli opprettet i forskjellige minneplassering |
Faktiske og formelle argumenter vil bli opprettet i samme minneplassering |
Sikkerhet | Faktiske argumenter gjenstår trygge da de ikke kan endres ved et uhell. |
Faktiske argumenter er det ikke Sikker. Det kan de være modifisert ved et uhell, så du må håndtere argumentoperasjoner nøye. |
Misligholde | Standard i mange programmeringer språk som C++.PHP. Visual Basic NET og C#. |
Det støttes av de fleste programmeringsspråk som JAVA, men ikke som standard. |
Fordeler med å bruke Call by value-metoden i C
Fordeler/fordeler med en samtale etter verdi i C:
- Metoden endrer ikke den opprinnelige variabelen, så den bevarer data.
- Når en funksjon kalles den, må du aldri påvirke det faktiske innholdet i de faktiske argumentene.
- Verdien av faktiske argumenter som overføres til de formelle argumentene, så eventuelle endringer som gjøres i det formelle argumentet påvirker ikke de virkelige tilfellene.
Fordeler med å bruke Call by reference-metoden
Fordeler med å bruke call by reference-metoden:
- Funksjonen kan endre verdien av argumentet, noe som er ganske nyttig.
- Det oppretter ikke dupliserte data for å holde bare én verdi som hjelper deg å spare minneplass.
- I denne metoden er det ingen kopi av argumentet. Derfor behandles det veldig raskt.
- Hjelper deg å unngå endringer gjort ved en feil
- En person som leser koden vet aldri at verdien kan endres i funksjonen.
Ulemper ved å bruke Call by value-metoden
Her er de store ulempene med en call by value-metode:
- Endringer i faktiske parametere kan også endre tilsvarende argumentvariabler
- I denne metoden må argumenter være variabler.
- Du kan ikke endre en variabel direkte i en funksjonskropp.
- Noen ganger kan argument være komplekse uttrykk
- Det er laget to kopier for den samme variabelen som ikke er minneeffektiv.
Ulemper ved å bruke Call by reference-metoden
Her er de viktigste ulempene ved å bruke call by reference-metoden:
- Sterk ikke-nullgaranti. En funksjon som tar inn en referanse må sørge for at inngangen ikke er null. Det er derfor ikke nødvendig å foreta nullsjekk.
- Passering ved referanse gjør at funksjonen ikke er rent teoretisk.
- En livstidsgaranti er et stort problem med referanser. Dette er spesielt farlig når du arbeider med lambdaer og flertrådede programmer.