© Miha Creative/Shutterstock.com

Viele unerfahrene Programmierer fragen sich, ob ihre Programmiersprache eine „Pass-by-Value“-oder „Pass-by-Reference“-Sprache ist. Um zu verstehen, welche Art von Sprache Sie verwenden, müssen Sie zuerst verstehen, was diese Begriffe bedeuten.

Einfach ausgedrückt verwenden Pass-by-Value-Sprachen eine Kopie eines im Speicher gespeicherten Werts. Pass-by-Reference-Sprachen verweisen auf den tatsächlichen Wert im Speicher, anstatt eine Kopie zu erstellen.

Lass uns Sehen Sie sich die Unterschiede zwischen Pass-by-Reference-und Pass-by-Value-Sprachen an.

Pass-by-Value vs. Pass-by-Reference: Side-by-Side-Vergleich

Pass-by-ValuePass-by-ReferenceValue SpeicherortMemoryMemoryValue AbrufmethodeCopy of Memory ValueReference to Memory Value LocationExample of Language Based on MethodJavaVariousOther NamesNonePass-By-Address

Pass-By-Value vs. Pass-By-Referenz: Was ist der Unterschied?

Eine wichtige Sache, die Sie sich merken sollten, ist, dass Pass-by-Value und Pass-by-Reference an dieser Stelle als veraltete Unterscheidungen angesehen werden. Das bedeutet, dass Sie sich keine Gedanken mehr darüber machen müssen, ob Ihre Funktionen Pass-by-Value oder Pass-by-Reference sind. Den Unterschied zwischen ihnen zu kennen, ist jetzt esoterisches Wissen, das Ihnen in praktischen Programmieranwendungen nicht viel Nutzen bringen wird.

Viele Sprachen, die heute noch verwendet werden, wurden entwickelt, um entweder Pass-by-Value oder Pass-by-Referenz und kann zusätzliche Funktionen haben, um eine Wertübergabe oder eine Referenzübergabe zu initiieren. Trotzdem brauchen Sie sich um Ihre gewählte Funktion keine Gedanken mehr zu machen. Sie sind jetzt funktional dasselbe.

Dennoch kann es nützlich sein, den Unterschied zwischen Pass-by-Value und Pass-by-Reference zu kennen. Werfen wir also einen Blick auf die funktionalen Unterschiede zwischen ihnen.

Aufruf von Funktionen

Der bedeutendste Unterschied zwischen Pass-by-Value und Pass-by-Reference ist, wie sie Funktionen aufrufen. Aufrufende Funktionen verwenden Argumente, die der Benutzer im Code bereitstellt. Wir bezeichnen die von den Argumenten aufgerufenen Funktionen als den „Angerufenen“, und die Funktion, die die Argumente aufruft, ist der „Aufrufer“. Die vom Aufrufer und Angerufenen übergebenen Werte werden als „tatsächliche Parameter“ bezeichnet. Die von der Funktion empfangenen Werte werden „formale Parameter“ genannt.

Bei der Verwendung von Wertübergabe wird eine Kopie der tatsächlichen Parameter im Speicher des Computers erstellt und dann als formale Parameter an die Funktion übergeben. Alle Änderungen, die an den formalen Parametern vorgenommen werden, sind nur für den Aufgerufenen sichtbar und für den Aufrufer unsichtbar, da der Aufrufer und der Aufgerufene beide über unabhängige Kopien des tatsächlichen Parameterwerts verfügen. Das bedeutet auch, dass Änderungen an den formalen Parametern die tatsächlichen Parameter im Speicher nicht ändern.

Pass-by-Reference-Funktionen referenzieren den tatsächlichen Wert im Speicher des Computers. Das bedeutet, dass der Aufrufer und der Angerufene denselben, nicht unabhängigen Wert verwenden, wenn sie auf diese Stelle im Speicher verweisen. Das bedeutet auch, dass alle Änderungen an den formalen Parametern sowohl für den Anrufer als auch für den Aufgerufenen sichtbar sind, da alle Änderungen an den formalen Parametern unter Verwendung der Referenz auf die tatsächlichen Parameter im Speicher vorgenommen werden.

Wann zu verwenden Pass-By-Value

Pass-By-Value-Funktionen werden am besten beim Erstellen einer Multithread-Anwendung verwendet. Der Grund dafür, dass Multithread-Anwendungen Pass-by-Value am besten verwenden, liegt darin, dass, wenn eine Anwendung Pass-by-Value verwendet, die anderen Threads Ihrer Anwendung daran gehindert werden, die formalen Parameter zu ändern, die von Ihrer Funktion verwendet werden. Angenommen, andere Threads können Ihre formalen Parameter ändern. In diesem Fall laufen Sie Gefahr, dass Ihre Funktionen brechen, wenn sie die falschen Parameter erhalten. Das Übergeben der Informationen als Wert ermöglicht es also jedem Thread, einen unabhängigen formalen Parameter zu verwenden, wodurch verhindert wird, dass sich die Funktionen gegenseitig stören.

Zusätzlich kann das Übergeben von Informationen als Wert in einer verteilten Anwendung den Netzwerk-Overhead einsparen und ermöglichen um effizienter zu laufen. Möglicherweise müssen Sie auch Wert übergeben, wenn Sie eine Sprache wie Java verwenden, die sich auf Wertübergabe konzentriert.

Während die meisten modernen Sprachen sowohl Wertübergabe als auch Referenzübergabe zulassen, bevorzugen einige Sprachen eine der anderen. Sie sollten also sicherstellen, dass die von Ihnen gewählte Sprache den Funktionsaufruf unterstützt, den Sie verwenden möchten.

Je nachdem, was Sie erstellen und wie Sie Informationen verwenden, kann Pass-by-Value oder Pass-by-Reference verwendet werden.

©DC Studio/Shutterstock.com

Wann Pass-By-Reference verwendet werden sollte

Das Pass-By-Reference erspart den Overhead beim Kopieren des Werts; das Programm muss den Wert nicht kopieren und diese Bearbeitungszeit wird eingespart. Wenn Sie also große Datenmengen und Strukturen übertragen, ist es viel effizienter, Pass-by-Reference zu verwenden, wenn Sie die Option haben.

Sie werden Pass-by-Reference verwenden wollen, wann immer Sie möchten um die aufrufende Funktion zu verwenden, um die tatsächlichen Parameter zu ändern. Diese Methode ist beispielsweise in Anwendungen hilfreich, die den Argumentwert in der aufrufenden Funktion ändern müssen. Es ist auch zeiteffizienter, daher sollten Anwendungen, die die zusätzliche Zeit nutzen können, eine Referenzübergabe in Betracht ziehen.

Demonstration von Pass-by-Value unter Verwendung von Javas swap()-und changeValue()-Funktionen

Viele unerfahrene Programmierer fragen sich, ob die von ihnen verwendeten Sprachen hauptsächlich Pass-by-Value oder Pass-by-Reference verwenden. Java ist eine Sprache, die typischerweise Pass-by-Value verwendet, wenn auch nicht immer.

Wir beginnen mit der Definition einer Klasse für Katzen und demonstrieren dann die Wertübergabe, indem wir die Farbe der Katze ändern.

public class Cat { private String color; öffentliche Katze () {} öffentliche Katze (String c) { this.color=c; } public String getColor() { Farbe zurückgeben; } public void setColor (String color) { this.color=color; } }

Wir können ein Programm mit der Funktion swap() erstellen, um die Farbe der Katze so zu ändern, dass die beiden Variablen – die im Speicher und die vom Programm verwendete Kopie – unterschiedlich sind.

öffentliche Klasse Test { public static void main(String[] args) { Cat ginger=new Cat(“Ginger”);//Speicherreferenz=50 Cat calico=new Cat(“Calico”);//Speicherreferenz=100 Swap (Ingwer, Calico); System.out.println(“Nachdem die Swap-Methode ausgeführt wurde:”); System.out.println(“`roter` Farbwert=”+ red.getColor()); System.out.println(“`calico` color value=”+ blue.getColor()); changeValue(Kaliko); System.out.println(“Nachdem die Methode changeValue ausgeführt wurde:”); System.out.println(“`calico` color value=”+ blue.getColor()); }//Generische Swap-Methode public static void swap(Object o1, Object o2){ Object temp=o1; o1=o2; o2=Temperatur; } private static void changeValue(Katze Katze) {//Katze=100 cat.setColor(“Ingwer”);//cat=100 cat=new Cat(“schildpatt”);//Ballon=200 cat.setColor (“calico”);//Balloon=200 } }

Das Ausführen dieses Codes wird Folgendes ausgeben:

Nach der Ausführung der Austauschmethode:

“Ingwer”-Farbwert=Ginger

„calico“-Farbwert=Calico

Nachdem die changeValue-Methode ausgeführt wurde:

„calico“-Farbwert=Ginger

Da die swap()-Methode dies nicht tut Ändern Sie nicht die ursprünglichen Werte, sondern nur die Kopien der Werte, erhalten Sie am Ende zwei Werte, die als derselbe Speicherort aufgeführt sind.

Diese Übung zeigt, dass Java normalerweise eine Pass-by-Value-Methodik verwendet. Sie können jedoch die Funktion changeValue() verwenden, um die im Speicher gespeicherten Werte zu ändern.

Demo von Pass-By-Reference mit C++’s swapnum()

Wir können die Übergabe von Referenzen mit demonstrieren C++. Die Funktion swapnum() ist ein Beispiel für das Modifizieren von Daten, die per Referenz übergeben werden.

#include void swapnum(int &i, int &j) { int temp=i; ich=j; j=Temperatur; } int main(void) { int a=10; int b=20; Auslagerungszahl(a, b); printf(“A ist %d und B ist %d\n”, a, b); 0 zurückgeben; }

Die Ausführung dieses Codes führt zu folgender Ausgabe:

A ist 20 und B ist 10

Dieser Code wirkt sich eher auf die Position der Daten im Speicher aus Erstellen einer Kopie der Daten. Wenn also der Code die Zahlen vertauscht, bewirkt er, dass sich die Datenausgabe ändert, um die neuen Speicherorte der Daten innerhalb des Programms widerzuspiegeln, was dazu führt, dass die Werte von A und B auf der Basisebene des Speichers vertauscht werden.

Abschließende Gedanken

Passing-by-Value und Passing-by-Reference sind möglicherweise veraltete Konzepte. Es ist jedoch immer noch gut, Ihre Grundlagen abzudecken und die inneren Machenschaften der Sprache zu verstehen, die Sie verwenden. Unabhängig davon, ob Sie eine Sprache verwenden, die hauptsächlich Pass-by-Value oder Pass-by-Reference verwendet, können Sie schneller auf Ihre Parameter zugreifen und diese ändern, wenn Sie besser verstehen, welche Methode Sie verwenden möchten.

Einige Sprachen, wie Java, verwenden möglicherweise ausschließlich die Wertübergabe, andere, wie C++, erfordern möglicherweise eine Referenzübergabe. Es ist also sinnvoll, diese Konzepte verstehen zu wollen, wenn Sie mehrere Sprachen lernen möchten.

Pass-by-Value vs. Pass-by-Reference: Was ist der Unterschied? FAQs (Frequently Asked Questions) 

Was ist Pass-by-Value?

Pass-by-Value ist eine Methode zum Abrufen von Informationen, die auf dem Computer gespeichert sind Speicher, indem die Daten in einen unabhängigen Wert kopiert werden.

Was ist Pass-by-Reference?

Pass-by-Reference ist eine Methode zum Abrufen von Informationen im Speicher des Computers gespeichert, indem direkt auf den Speicherort der Daten im Computerspeicher verwiesen wird.

Welche Sprachen verwenden hauptsächlich Pass-by-Value?

Java ist eine Sprache, die beim Abrufen von Daten aus dem Speicher fast ausschließlich Pass-by-Value verwendet.

Welche Sprachen verwenden hauptsächlich Pass-by-Reference?

C++ Übergibt hauptsächlich Daten aus dem Speicher per Referenz an ein Programm.

Ist Pass-by-Value besser als Pass-by-Reference?

In der heutigen Zeit , sind diese beiden Funktionstypen nahezu synonym und erfordern keine genaue Kenntnis ihrer Unterschiede.

By Maxwell Gaven

Ich habe 7 Jahre im IT-Bereich gearbeitet. Es macht Spaß, den stetigen Wandel im IT-Bereich zu beobachten. IT ist mein Job, Hobby und Leben.