Razlika između poziva prema vrijednosti i poziva prema referenci
Ključna razlika između poziva prema vrijednosti i poziva prema referenci
- U metodi poziva po vrijednosti izvorna vrijednost se ne mijenja, dok se u metodi poziva po referenci izvorna vrijednost mijenja.
- U Call by value prosljeđuje se kopija varijable, dok se u Call by reference prosljeđuje sama varijabla.
- U Call by value, stvarni i formalni argumenti bit će kreirani na različitim memorijskim lokacijama, dok će u Call by reference stvarni i formalni argumenti biti kreirani na istoj memorijskoj lokaciji.
- Poziv prema vrijednosti zadana je metoda u programskim jezicima poput C++, PHP, Visual Basic NET i C#, dok je poziv po referenci podržan samo u Java Jezik.
- Varijable Call by Value prosljeđuju se jednostavnom metodom, dok su pokazivači Call by Reference potrebni za pohranu adrese varijabli.
U programskim jezicima funkcije se mogu pozvati na dva načina: što je poznato kao poziv po vrijednosti i poziv po referenci.
Što je metoda poziva prema vrijednosti?
Metoda poziva prema vrijednosti kopira vrijednost argumenta u formalni parametar te funkcije. Stoga promjene napravljene na parametru glavne funkcije ne utječu na argument.
U ovoj metodi prosljeđivanja parametara, vrijednosti stvarnih parametara kopiraju se u formalne parametre funkcije, a parametri se pohranjuju na različitim memorijskim lokacijama. Stoga se sve promjene unutar funkcija ne odražavaju na stvarne parametre pozivatelja.
Što je metoda poziva po referenci?
Metoda poziva po referenci kopira adresu argumenta u formalni parametar. U ovoj metodi, adresa se koristi za pristup stvarnom argumentu koji se koristi u pozivu funkcije. To znači da promjene napravljene u parametru mijenjaju prolazni argument.
U ovoj metodi, dodjela memorije ista je kao stvarni parametri. Sve operacije u funkciji izvode se na vrijednosti pohranjenoj na adresi stvarnog parametra, a modificirana vrijednost bit će pohranjena na istoj adresi.
Primjer C koda metode poziva prema vrijednosti
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; }
Izlaz:
before function calling 10 value is 11 after function calling 1-0
Budući da se varijabla deklarirana 'a' u main() razlikuje od varijable 'x' u increment(). U ovom programu samo su imena varijabli slična, ali su njihove memorijske adrese različite i pohranjene na različitim memorijskim mjestima.
Java Primjer koda metode poziva po referenci
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; }
Izlaz:
Before call Value of a =10 After call Value of a =11
Budući da varijabla deklarirana 'a' u referencira/pokazuje na varijablu 'a' u main(). Ovdje je naziv varijable drugačiji, ali oba pokazuju/referenciraju na iste lokacije memorijske adrese.
Poziv prema vrijednosti naspram poziva po referenci
Parametri | Nazovite prema vrijednosti | Nazovite putem reference |
---|---|---|
Definicija | Kada pozivate funkciju, kada prosljeđujete vrijednosti kopiranjem varijabli, to je poznato kao "Poziv prema vrijednostima". | Prilikom pozivanja funkcije, u programskom jeziku umjesto kopiranja vrijednosti varijabli, koristi se adresa varijabli, što je poznato kao “Poziv po referencama”. |
argumenti | U ovoj metodi prosljeđuje se kopija varijable. | U ovoj metodi prosljeđuje se sama varijabla. |
Posljedica | Promjene napravljene u kopiji varijable nikada ne mijenjaju vrijednost varijable izvan funkcije. | Promjena varijable također utječe na vrijednost varijable izvan funkcije. |
Promjena vrijednosti | Ne dopušta vam da napravite bilo kakve promjene u stvarnim varijablama. | Omogućuje vam da napravite promjene u vrijednostima varijabli pomoću poziva funkcija. |
Prijenos varijable | Vrijednosti varijabli prosljeđuju se jednostavnom metodom. | Pokazivačke varijable potrebne su za pohranjivanje adrese varijabli. |
Promjena vrijednosti | Izvorna vrijednost nije promijenjena. | Izvorna vrijednost je izmijenjena. |
Mjesto memorije | Stvarni i formalni argumenti stvarat će se u različitim mjesto memorije |
Stvarni i formalni argumenti nastat će u istoj mjesto memorije |
Sigurnosni | Stvarni argumenti ostaju sigurni jer se ne mogu mijenjati slučajno. |
Stvarni argumenti nisu Sef. Oni mogu biti slučajno izmijenjen, tako da morate pažljivo rukovati operacijama argumenata. |
Zadano | Zadana u mnogim programima jezicima poput C++.PHP. Visual Basic NET i C#. |
Podržava ga većina programski jezici poput JAVE, ali ne kao zadano. |
Prednosti korištenja metode Call by value u C-u
Prednosti/prednosti poziva prema vrijednosti u C:
- Metoda ne mijenja izvornu varijablu, tako da čuva podatke.
- Kad god se funkcija pozove, nikada ne utječe na stvarni sadržaj stvarnih argumenata.
- Vrijednost stvarnih argumenata prenesena je na formalne argumente, tako da sve promjene napravljene u formalnom argumentu ne utječu na stvarne slučajeve.
Prednosti korištenja metode poziva pozivom
Prednosti korištenja poziva referentnom metodom:
- Funkcija može promijeniti vrijednost argumenta, što je vrlo korisno.
- Ne stvara duple podatke za držanje samo jedne vrijednosti što vam pomaže da uštedite memorijski prostor.
- U ovoj metodi ne postoji kopija napravljenog argumenta. Stoga se vrlo brzo obrađuje.
- Pomaže vam da izbjegnete promjene učinjene greškom
- Osoba koja čita kod nikada ne zna da se vrijednost može mijenjati u funkciji.
Nedostaci korištenja metode Call by value
Evo glavnih mana/nedostataka metode poziva prema vrijednosti:
- Promjene stvarnih parametara također mogu modificirati odgovarajuće varijable argumenata
- U ovoj metodi argumenti moraju biti varijable.
- Ne možete izravno promijeniti varijablu u tijelu funkcije.
- Ponekad argumenti mogu biti složeni izrazi
- Postoje dvije kopije stvorene za istu varijablu što nije memorijski učinkovito.
Nedostaci korištenja metode poziva po referenci
Ovdje su glavni nedostaci upotrebe poziva referentnom metodom:
- Snažno jamstvo bez nule. Funkcija koja uzima referencu mora osigurati da unos nije null. Stoga ne treba napraviti nultu provjeru.
- Prijenos po referenci čini funkciju nečistom teoretski.
- Doživotno jamstvo je veliki problem s referencama. Ovo je posebno opasno kada radite s lambdama i programima s više niti.