Zeiger als Parameter immer besser als vector?
-
Albert12 schrieb:
Ist es immer besser einer Funktion einen Zeiger auf einen vector zu übergeben, anstatt den vector selbst?
Kommt drauf an. Es gibt zwei Fälle:
- Die Funktion kopiert das Objekt sowieso -> Wertübergabevoid foo(vector<int> vec)
- Die Funktion kopiert das Objekt nicht (verwendet es nur vorübergehend oder speichert die Adresse des Objektes) -> Referenzübergabevoid foo(const vector<int> &vec)
-
krümelkacker schrieb:
....
C++11:
vector<int> umdrehen(vector<int> v) { reverse(v.begin(),v.end()); return v; } int main() { vector<int> x = {1,2,3,5,8,13}; x = umdrehen(move(x)); }Hier wird nirgendswo etwas unnötig kopiert. Der Vektor zieht in den Scope der Funktion um, wird dort verändert und zieht dann quasi wieder zurück. So erlaubt C++2011 einen etwas funktionaleren Stil, ohne dass man sich mit Zeigern und Referenzen die Hände dreckig machen muss und ohne hohe Kosten bzgl Performanz.
...
kkOk super, jetzt hab ichs glaub grob verstanden. Ich wollte garnicht darauf raus, dass eine Kopie verändert werden kann und bei einem Zeiger oder einer Referenz die Variable außerhalb auch geändert wird.
Bei dem C++11 Beispiel erkennt der Compiler also automatisch, ob der übergebene Vektor sich selbst wieder zugewiesen bekommt?!
Bei vorhergehenden Versionen hätte er hier also eine Kopie auf den Stack gelegt und eine Kopie zurückgegeben?
-
-
314159265358979 schrieb:
krümelkacker schrieb:
...
Möchtest du uns etwas mitteilen?
language: C++0x (gcc-4.5.1)
-
Wie kommst du nur darauf.
-
Alles, was ich da sehe, ist, dass der GCC 4.5.1 nicht C++11-konform ist.
Gibt's da sonst noch was zu sehen?
-
Hi,
auch heute wieder, gibt es Senf
Bei der Übergabe von Strukturen und Klassen, oder besser Objekten,
ist es immer besser eine (konstante) Referenz zu nehmen.Wenn man einen Zeiger nimmt, muss man zuviel mit dem * Arbeiten.
Wenn man eine Kopie des Objektes erzeugt, wird erst der CopyCTor aufgerufen und
am ende der Funktion wieder der entsprechende DTor. Wenn jetzt der Vector
auch noch als Elementtyp ein Objekt hat kann es je nach implementation
quasi eeewig dauern bis Du vollständig deine Funktion betreten hast.Seid gegrüßt
-
Albert12 schrieb:
Bei dem C++11 Beispiel erkennt der Compiler also automatisch, ob der übergebene Vektor sich selbst wieder zugewiesen bekommt?!
Ob er das "erkennt" oder nicht, spielt gar keine Rolle. Die Funktion liefert einen namenlosen Vektor zurück und der entsprechende Zuweisungsoperator nutzt dies aus und klaut dem temporären Vektor quasi seine Eingeweide.
Albert12 schrieb:
Bei vorhergehenden Versionen hätte er hier also eine Kopie auf den Stack gelegt und eine Kopie zurückgegeben?
Das passiert immer noch. Aus der überflüssigen Kopie wird nur ein „Move“.
-
krümelkacker schrieb:
Alles, was ich da sehe, ist, dass der GCC 4.5.1 nicht C++11-konform ist.
Gibt's da sonst noch was zu sehen?Letztes mal hat man mir gesagt, bei Argumenten ist das nicht erlaubt. Dieses mal sagt man mir der GCC wäre nicht standardkonform.
Verarschen kann ich mich selbst.
-
Wahrscheinlich verwechselst du das gerade mit NRVO, was – soweit ich weiß – in dem Fall nicht mehr erlaubt ist. Nicht, dass das schlimm wäre; denn das hat ja eh kein Compiler „geschafft“.
Der GCC 4.6.1 macht das jedenfalls richtig.
-
krümelkacker schrieb:
Wahrscheinlich verwechselst du das gerade mit NRVO, was – soweit ich weiß – in dem Fall nicht mehr erlaubt ist. Nicht, dass das schlimm wäre; denn das hat ja eh kein Compiler „geschafft“.
Der GCC 4.6.1 macht das jedenfalls richtig.
Danke für die Erläuterung, krümelkacker... jetzt ist mir klar, was pi meinte.
@pi: Ein Link auf ideone stellt kein Argument dar; das musst du schon noch dazu formulieren, wenn du verstanden werden willst.