Разлика между повикване по стойност и повикване по референция
Ключова разлика между повикване по стойност и повикване по референция
- При метода Call by value оригиналната стойност не се променя, докато при метода Call by reference оригиналната стойност се променя.
- При Call by value се предава копие на променливата, докато при Call by reference се предава самата променлива.
- При Call by value действителните и формалните аргументи ще бъдат създадени в различни места в паметта, докато при Call by reference действителните и формалните аргументи ще бъдат създадени в едно и също място в паметта.
- Извикването по стойност е методът по подразбиране в езици за програмиране като C++, PHP, Visual Basic NET и C#, докато Call by reference се поддържа само в Java език.
- Променливите Call by Value се предават с помощта на ясен метод, докато указателите Call by Reference са необходими за съхраняване на адреса на променливите.
В езиците за програмиране функциите могат да бъдат извикани по два начина: който е известен като извикване по стойност и извикване по препратка.
Какво представлява методът Call by Value?
Методът извикване по стойност копира стойността на аргумент във формалния параметър на тази функция. Следователно промените, направени в параметъра на основната функция, не засягат аргумента.
При този метод за предаване на параметри стойностите на действителните параметри се копират във формалните параметри на функцията и параметрите се съхраняват в различни места в паметта. Така че всички промени, направени във функциите, не се отразяват в действителните параметри на повикващия.
Какво представлява методът на повикване чрез референция?
Методът за извикване чрез препратка копира адреса на аргумент във формалния параметър. В този метод адресът се използва за достъп до действителния аргумент, използван при извикването на функцията. Това означава, че направените промени в параметъра променят предаващия аргумент.
При този метод разпределението на паметта е същото като действителните параметри. Всички операции във функцията се извършват върху стойността, съхранена на адреса на действителния параметър, а модифицираната стойност ще бъде съхранена на същия адрес.
Пример за код на C за метод на извикване по стойност
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; }
Изход:
before function calling 10 value is 11 after function calling 1-0
Тъй като променливата, декларирана 'a' в main() е различна от променливата 'x' в increment(). В тази програма само имената на променливите са подобни, но адресите им в паметта са различни и се съхраняват в различни места в паметта.
Java Пример за код на метод за извикване по препратка
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; }
Изход:
Before call Value of a =10 After call Value of a =11
Тъй като променливата, декларирана като 'a' в, препраща/сочи към променлива 'a' в main(). Тук името на променливата е различно, но и двете сочат/препращат към едни и същи адреси на паметта.
Извикване по стойност срещу извикване по референция
параметри | Обаждане по стойност | Обадете се чрез справка |
---|---|---|
дефиниция | Докато извиквате функция, когато предавате стойности чрез копиране на променливи, това е известно като „Извикване по стойности“. | Докато се извиква функция, на езика за програмиране, вместо да се копират стойностите на променливите, се използва адресът на променливите, известен като „Извикване чрез препратки. |
Аргументи | При този метод се предава копие на променливата. | При този метод се предава самата променлива. |
ефект | Промените, направени в копие на променлива, никога не променят стойността на променливата извън функцията. | Промяната в променливата също засяга стойността на променливата извън функцията. |
Промяна на стойността | Не ви позволява да правите промени в действителните променливи. | Позволява ви да правите промени в стойностите на променливите чрез извикване на функции. |
Предаване на променлива | Стойностите на променливите се предават с помощта на ясен метод. | Променливите указатели са необходими за съхраняване на адреса на променливите. |
Промяна на стойността | Оригиналната стойност не е променена. | Оригиналната стойност е променена. |
Местоположение в паметта | Действителни и формални аргументи ще бъдат създадени в различни място в паметта |
Действителни и формални аргументи ще бъдат създадени в същото място в паметта |
Безопасност | Действителните аргументи остават безопасни, тъй като не могат да бъдат модифицирани случайно. |
Действителните аргументи не са безопасно. Те могат да бъдат случайно променен, така че трябва внимателно да боравите с операциите с аргументи. |
По подразбиране | По подразбиране в много програми езици като C++.PHP. Visual Basic NET и C#. |
Поддържа се от повечето езици за програмиране като JAVA, но не по подразбиране. |
Предимства на използването на метода Call by value в C
Плюсове/предимства на обаждане по стойност в C:
- Методът не променя оригиналната променлива, така че запазва данните.
- Всеки път, когато се извика функция, никога не засягайте действителното съдържание на действителните аргументи.
- Стойността на действителните аргументи се предава на формалните аргументи, така че всички промени, направени във формалния аргумент, не засягат реалните случаи.
Предимства на използването на метода "Повикване чрез справка".
Предимства на използването на метода на повикване чрез справка:
- Функцията може да променя стойността на аргумента, което е доста полезно.
- Той не създава дублирани данни за съхраняване само на една стойност, което ви помага да спестите място в паметта.
- При този метод няма копие на направения аргумент. Поради това се обработва много бързо.
- Помага ви да избегнете промени, направени по погрешка
- Човек, който чете кода, никога не знае, че стойността може да бъде променена във функцията.
Недостатъци на използването на метода Call by value
Ето основните минуси/недостатъци на метода на извикване по стойност:
- Промените в действителните параметри могат също да променят съответните променливи на аргумента
- В този метод аргументите трябва да са променливи.
- Не можете директно да промените променлива в тялото на функция.
- Понякога аргументите могат да бъдат сложни изрази
- Има две създадени копия за една и съща променлива, което не е ефективно за паметта.
Недостатъци на използването на метода "Повикване чрез справка".
Ето основните недостатъци на използването на метода на повикване чрез справка:
- Силна ненулева гаранция. Функция, приемаща препратка, трябва да се увери, че входът е различен от нула. Следователно не е необходимо да се прави нулева проверка.
- Преминаването по референция прави функцията нечиста теоретично.
- Доживотната гаранция е голям проблем с референциите. Това е особено опасно при работа с ламбда и многонишкови програми.