Forskellen mellem Call by Value og Call by Reference

Nรธgleforskel mellem Call by Value og Call by Reference

  • I Call by value-metoden รฆndres den oprindelige vรฆrdi ikke, hvorimod den oprindelige vรฆrdi รฆndres i Call by reference-metoden.
  • I Call by value sendes en kopi af variablen, mens der i Call by reference overfรธres en variabel i sig selv.
  • I Call by value vil faktiske og formelle argumenter blive oprettet pรฅ forskellige hukommelsesplaceringer, hvorimod i Call by reference vil faktiske og formelle argumenter blive oprettet pรฅ den samme hukommelsesplacering.
  • Kald efter vรฆrdi er standardmetoden i programmeringssprog som f.eks C++, PHP, Visual Basic NET og C#, hvorimod Call by reference kun understรธttes i Java Sprog.
  • Call by Value variabler videregives ved hjรฆlp af en ligetil metode, hvorimod Call by Reference pointere er pรฅkrรฆvet for at gemme adressen pรฅ variabler.

Forskellen mellem Call by Value og Call by Reference

I programmeringssprog kan funktioner aktiveres pรฅ to mรฅder: som er kendt som Call by Value og Call by Reference.

Hvad er Call by Value-metoden?

Call by value-metoden kopierer vรฆrdien af โ€‹โ€‹et argument ind i den formelle parameter for denne funktion. Derfor pรฅvirker รฆndringer foretaget af parameteren for hovedfunktionen ikke argumentet.

I denne parameteroverfรธrselsmetode kopieres vรฆrdier af aktuelle parametre til funktionens formelle parametre, og parametrene gemmes pรฅ forskellige hukommelsesplaceringer. Sรฅ eventuelle รฆndringer foretaget inde i funktioner afspejles ikke i de faktiske parametre for den, der ringer.

Hvad er Call by Reference-metoden?

Call by reference-metoden kopierer adressen pรฅ et argument til den formelle parameter. I denne metode bruges adressen til at fรฅ adgang til det faktiske argument, der bruges i funktionskaldet. Det betyder, at รฆndringer foretaget i parameteren รฆndrer det bestรฅede argument.

I denne metode er hukommelsesallokeringen den samme som de faktiske parametre. Alle handlinger i funktionen udfรธres pรฅ den vรฆrdi, der er gemt pรฅ adressen for den aktuelle parameter, og den รฆndrede vรฆrdi vil blive gemt pรฅ den samme adresse.

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

Output:

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

Fordi variabel erklรฆret 'a'in main() er forskellig fra variabel 'x' i increment(). I dette program er kun variabelnavne ens, men deres hukommelsesadresse er forskellige og gemt pรฅ forskellige hukommelsesplaceringer.

Java Code Eksempel pรฅ en referencekaldsmetode

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

Fordi variabel erklรฆret 'a' i refererer/peger til variabel 'a' i main(). Her er variabelnavnet forskelligt, men begge peger/refererer til samme hukommelsesadresseplaceringer.

Opkald efter vรฆrdi vs. Opkald efter reference

Driftsparametre Ring efter vรฆrdi Ring ved henvisning
Definition Nรฅr du kalder en funktion, nรฅr du sender vรฆrdier ved at kopiere variabler, er det kendt som "Call By Values." Mens du kalder en funktion, i programmeringssprog i stedet for at kopiere vรฆrdierne af variabler, bruges adressen pรฅ variablerne, den er kendt som "Call By References.
argumenter I denne metode sendes en kopi af variablen. I denne metode sendes en variabel i sig selv.
Effekt ร†ndringer foretaget i en kopi af variabel รฆndrer aldrig vรฆrdien af โ€‹โ€‹variabel uden for funktionen. ร†ndring i variablen pรฅvirker ogsรฅ vรฆrdien af โ€‹โ€‹variablen uden for funktionen.
ร†ndring af vรฆrdi Tillader dig ikke at foretage รฆndringer i de faktiske variable. Giver dig mulighed for at foretage รฆndringer i vรฆrdierne af variabler ved at bruge funktionskald.
Overfรธrsel af variabel Vรฆrdier af variable overfรธres ved hjรฆlp af en ligetil metode. Pointervariabler er nรธdvendige for at gemme variables adresse.
Vรฆrdiรฆndring Oprindelig vรฆrdi ikke รฆndret. Den oprindelige vรฆrdi er รฆndret.
Hukommelsesplacering Faktiske og formelle argumenter
vil blive oprettet i forskellige
hukommelsesplacering
Faktiske og formelle argumenter
vil blive oprettet i samme
hukommelsesplacering
Sikkerhed Faktiske argumenter er tilbage
sikre, da de ikke kan รฆndres
ved en fejltagelse.
Faktiske argumenter er det ikke
Sikker. Det kan de vรฆre
ved et uheld รฆndret, sรฅ du skal hรฅndtere argumentoperationer omhyggeligt.
Standard Standard i mange programmeringer
sprog som C++.PHP. Visual Basic NET og C#.
Det understรธttes af de fleste
programmeringssprog som JAVA, men
ikke som standard.

Fordele ved at bruge Call by value-metoden i C

Fordele/fordele ved et opkald efter vรฆrdi i C:

  • Metoden รฆndrer ikke den oprindelige variabel, sรฅ den bevarer data.
  • Nรฅr en funktion kaldes den, mรฅ du aldrig pรฅvirke det faktiske indhold af de faktiske argumenter.
  • Vรฆrdien af โ€‹โ€‹faktiske argumenter overfรธrt til de formelle argumenter, sรฅ eventuelle รฆndringer i det formelle argument pรฅvirker ikke de reelle tilfรฆlde.

Fordele ved at bruge Call by reference-metoden

Fordele ved at bruge call by reference-metoden:

  • Funktionen kan รฆndre vรฆrdien af โ€‹โ€‹argumentet, hvilket er ret nyttigt.
  • Det opretter ikke duplikerede data for kun at holde en vรฆrdi, hvilket hjรฆlper dig med at spare hukommelsesplads.
  • I denne metode er der ingen kopi af argumentet. Derfor behandles det meget hurtigt.
  • Hjรฆlper dig med at undgรฅ รฆndringer udfรธrt ved en fejl
  • En person, der lรฆser koden, ved aldrig, at vรฆrdien kan รฆndres i funktionen.

Ulemper ved at bruge Call by value-metoden

Her er de store ulemper/ulemper ved en call by value-metode:

  • ร†ndringer af faktiske parametre kan ogsรฅ รฆndre tilsvarende argumentvariabler
  • I denne metode skal argumenter vรฆre variable.
  • Du kan ikke รฆndre en variabel direkte i en funktions krop.
  • Nogle gange kan argumenter vรฆre komplekse udtryk
  • Der er oprettet to kopier til den samme variabel, som ikke er hukommelseseffektiv.

Ulemper ved at bruge Call by reference-metoden

Her er de stรธrste ulemper ved at bruge call by reference-metoden:

  • Stรฆrk ikke-nul garanti. En funktion, der tager en reference ind, skal sikre, at inputtet ikke er nul. Derfor skal der ikke foretages nulkontrol.
  • Bestรฅelse ved henvisning gรธr, at funktionen ikke er rent teoretisk.
  • En livstidsgaranti er et stort problem med referencer. Dette er specielt farligt, nรฅr du arbejder med lambdaer og flertrรฅdede programmer.

Opsummer dette indlรฆg med: