Gibt es in C ++ eine Art Regel oder Anleitung, wann genau man sich für die Verwendung von Vorübergehender Referenzen entscheiden sollte?
Und wenn es um die Größe des Objekts mit einem Objekt soweit bekannt ist ( wenig ehrlich ) kann es schwierig werden, das zu beurteilen.
Sie sollten als Referenz übergeben werden, wenn Änderungen an den Argumenten außerhalb der Funktion sichtbar sein sollen. Dies ist ein Durchlauf von nicht const
Referenz und ist meist durch Logik statt Effizienz motiviert.
Sie sollten die Referenz (meistens const
) verwenden, wenn Sie mit Datentypen arbeiten, deren Größe größer ist als die eines Registers. Da die Referenz meistens const
ist, können Sie keine Änderungen daran vornehmen, daher ist dies auf Effizienz zurückzuführen.
swap(a,b)
, zum Beispiel - da Sie tatsächlich die Originalreferenzen benötigen, um den Austausch durchzuführen.) Normalerweise verwende ich in den folgenden Situationen "pass by reference":
1) Das Objekt ist größer als ein Zeiger: Wenn das Objekt nicht geändert werden soll, verwenden Sie einen konstanten Verweis:
%Vor%mit foo erklärt als:
%Vor%2) Um den Code zu verdeutlichen, versuchen Sie, Thigs wie folgt zu vermeiden:
%Vor%unter Verwendung einer Struktur:
%Vor%mit foo definiert als:
%Vor%3) für Beschleunigungsmodule: Denken Sie daran, dass Aufruffunktionen Parameter auf Stack setzen müssen 4) Sie müssen Parameter innerhalb der Funktion ändern.
%Vor%mit foo erklärt als:
%Vor% Bevorzugt pass-by-reference-to-const
bis pass-by-value
. Wertübergabe ist eine teure Operation, da Kopien des Objekts von Kopier-Costruktoren erstellt werden. Wenn Sie einige nicht-primitive Datenelemente in der Klasse haben (zB: std::string
), würden jedes Mal, wenn ein neues Objekt der Klasse erstellt wird, auch diese std::string
-Objekte erstellt.
Durch den Verweis wird auch slicing problem
vermieden. Wenn Sie ein abgeleitetes Klassenobjekt als Wert an eine Funktion übergeben, die das Basisklassenobjekt erwartet, werden die abgeleiteten Merkmale der abgeleiteten Klasse abgeschnitten und das Objekt in der Funktion würde sich wie ein Basisklassenobjekt verhalten. Wenn Sie als Referenz übergeben werden, kann Slicing vermieden werden.
Trotzdem gibt es einige Fälle, in denen Sie nicht als Referenz durchgehen können. Wenn Ihre Funktionsargumente oder der Rückgabewert NULL-Werte haben müssen, können Sie keine Referenzen verwenden.
Tags und Links c++