CodingCat hat geschrieben:Die Variante mit new ist definitiv vielfach langsamer als die Variante, einen einfachen Vektor (NICHT Vektor*) zurückzugeben.
Oh, das wusste ich nicht, aber es stimmt, habs gerade mal schnell ausprobiert, die new-Methode dauert ungefähr 10 mal so lange. Aber warum ist das so? Was ist der interne Unterschied darin, ob ich ne Variable mit
Vektor *a=new Vektor(); oder mit
Vektor a; anlege? In beiden Fällen wird doch Speicher bereitgestellt und der Standardkonstruktor aufgerufen.
CodingCat hat geschrieben:Tatsächlich solltest du so selten wie möglich mit new angelegte Objekte einfach so als Zeiger zurückgeben, und auf keinen Fall permanent neue temporäre Objekte mittels new anlegen, um winzige Kopien zu "sparen".
gut, das wurde mir jetzt klar.
CodingCat hat geschrieben:Um sinnvoll Kopien einzusparen, solltest du dich auf jeden Fall mit Referenzen vertraut machen. Die korrekte Variante für dein Eingangsbeispiel wäre Michis Variante
Ja, das ist mir klar, das oben war auch nur schnell ein Beispiel. Dass es mit Call-By-Reference (oder Call-By-Pointer) die Werte nicht kopiert werden müssen und daher schneller sind als mit Call-By-Value.
CodingCat hat geschrieben:Der einzige Aufwand, der bleibt, ist der Kopieraufwand bei der Rückgabe. Aber auch hier hast du Glück: es ist dem Compiler erlaubt, die Kopie wegzuoptimieren, d.h. mit jedem vernünftigen Compiler sollte hier kein Zusatzaufwand anfallen.
Das ist natürlich gut, das wusste ich nicht (und hab das Beispiel von Wiki gerade mal getestet und es funktioniert sogar ;) ) und ohne das bliebe ja nur noch die Alternative mit dem Übergeben eines nicht-konstanten Zeigers wie du es ja auch schon geschrieben hast.
Krishty hat geschrieben:Ich wette, sobald da irgendwo eine Exception fliegt hast du mehr Speicherlecks als wenn du überall alles mit Zeigern zurückgeben würdest ;) So lange die Objekte nicht größer als ein paar hundert KiB sind, immer automatisch allokieren.
Oh, das stimmt natürlich, da hab ich gar nicht dran gedacht...
Krishty hat geschrieben:CodingCat hat geschrieben:auf dem Heap angelegte Objekte
Vermeide es, in der Nähe Unkundiger von Stapel- und Freispeicher zu sprechen.
Danke, das war ein sehr gutes Stichwort... Ich hab ja eigentlich nicht umsonst ein Buch über die C++-Grundlagen bei mir herumliegen, da steht der Heap sehr schön erklärt drin... Und das beantwortet evtl. auch schon meine Frage von oben: der Stack an sich ist zwar langsamer als der Heap, aber die Speicheranforderung vom Stack ist wesentlich schneller, so dass sich der Heap nur bei wirklich großen Objekten lohnt. Richtig so?
Danke und Grüße
hundvdf
PS: Mein Hauptproblem ist wohl eher, dass ich schon seit Ewigkeiten kein C++ mehr Programmiert hab, sondern durch das Studium nur ein bisschen mit Java, und da muss man sowas ja nicht unbedingt beachten.