Konvertieren eines Pointers in Referenz, teuer? [Duplikat]

7

Wenn ich einen Zeiger auf ein Objekt habe, sagen wir Object *ptr; , und ich möchte das an eine Methode der Form void foo(Object& obj) übergeben. Ich verstehe, dass ich schreiben muss:

%Vor%

Aber warum dereference ptr ? Wäre es nicht sinnvoll, es einfach in foo(ptr); zu übergeben? Ich mache mir Sorgen, dass *ptr möglicherweise eine Kopie des ursprünglichen Objekts erstellt oder zumindest nicht nur foo an die Adresse weitergibt, mit der gearbeitet werden soll.

Kann jemand das für mich klären? Übergibt *ptr einen möglichen Engpass, bei Code, der erwartet, dass sich dieses Verhalten genauso schnell verhält, als wäre die Funktion void foo(Object *obj); und über foo(ptr) ? Aufgerufen worden?

    
Mr. Smith 07.01.2013, 10:03
quelle

5 Antworten

11

Ob die Übergabe von *ptr eine Kopie erstellt oder nicht, hängt davon ab, ob die aufgerufene Funktion ein Object oder ein Object & erwartet.

Im ersten Fall würde eine Kopie erstellt werden. Im letzteren Fall (d. H. In Ihrem Fall) wird no kopiert.

    
DevSolar 07.01.2013, 10:09
quelle
12
  

Ich mache mir Sorgen * ptr erstellt möglicherweise eine Kopie des ursprünglichen Objekts.

Sie liegen falsch. Dereferenzieren eines Zeigers macht keine Kopie!

%Vor%

In der letzten Zeile dieses Codes gibt es keine Kopie. Der Standard gibt Ihnen diese Garantie.

Wenn jedoch f das Argument als Wert verwendet, wird kopiert.

Die Grundlinie: Die Referenz im Funktionsparameter wird verwendet, um vermeiden kopieren (oft) oder als Ausgabeparameter (gelegentlich)!

    
Nawaz 07.01.2013 10:07
quelle
0

Wenn ein Objekt als Referenz übergeben wird, wird der Zeiger so übergeben, dass foo (* ptr) korrekt ist und das Objekt nicht kopiert wird. Warum deneferenzieren? Weil die Funktionssignatur ein Objekt und keinen Zeiger auf ein Objekt benötigt. C ++ ist eine stark typisierte Sprache.

    
TheMathemagician 07.01.2013 10:09
quelle
0

Um den Verweis auf eine Funktion zu übergeben, müssen Sie das Objekt wie in der Wertesemantik übergeben. Zeiger sind keine Referenzen, da sie Entitätssemantiken (Adressen) sind.

Wenn Sie einen Zeiger dereferenzieren, erhalten Sie einen tatsächlichen Wert, der als Referenz eingebettet werden kann.

    
phaazon 07.01.2013 10:09
quelle
0

Referenzen und Zeiger sind gleich. Aber Referenzen haben ihren eigenen Vorteil und das ist, dass sie nicht null sein können (obwohl sie es können, aber es ist ziemlich schwer, eine Nullreferenz zu machen), so dass Sie die Prüfung gegen den nullptr weglassen können. Sie können verwenden. anstelle von - & gt; Das ist ein Zeichen kürzer xD. Über Ihre Frage, da die Zeiger Referenzen sind die gleichen am Ende gibt es keine Vorteile der Auswahl eines über dem anderen. Ich meine, die folgenden Codes sind die gleichen, wenn sie kompiliert werden.

%Vor%

und

%Vor%

Wenn Sie eine Referenz verwenden, wird im Hintergrund eine Dereferenzierung durchgeführt. Hoffe es hat geholfen.

    
Mohsen Khaki 07.01.2013 10:23
quelle

Tags und Links