2016-07-10 16 views
0

Ich las einige Artikel und in vielen von ihnen erwähnt, über Expression-Vorlagen können vermeiden, temporäre Objekte zu verwenden. Aber keiner von ihnen erwähnte, wie das gemacht wird. Soweit ich weiß, werden Operationen aufgrund der Designarchitektur mit temporären Objekten durchgeführt. Zum Beispiel, wenn a, b und c sind zwei Matrix und wenn wir tun a = b+c dann das Ergebnis von b+c wird in einem temporären Objekt wie temp = b+c gehalten und dann wird das Ergebnis zurück zu einem wie a = temp kopiert.Wie Vorlagenausdrücke von Provisorien loswerden

Wenn wir jedoch Expressionsvorlagen verwenden, gibt diese Additionsoperation (+) die Referenz von b und c zurück, und dann erfolgt die Hauptberechnung, wenn der Zuweisungsoperator (=) ausgewertet wird. Dies ist das einfache allgemeine Konzept des Template-Ausdrucks. Aber ich verstehe nicht, wie es temporäre Objekte los wird. Es wäre schön, wenn jemand nur die allgemeine Vorstellung davon geben könnte, wie dieses Temporäre vermieden wird.

+1

Sie könnten [diese Antwort] (http://stackoverflow.com/a/11812468/1322972) auf eine verwandte, aber nicht doppelte Frage finden, interessant. – WhozCraig

+0

Sie erhalten immer noch ein temporäres Objekt, aber nicht den endgültigen Typ, Sie haben einen temporären Wrapper. – Jarod42

Antwort

2

Nehmen wir das Beispiel

Vector a,b,c,d; 
a = b + c + d; 

Normalerweise würde dies wie

a = b.operator+(c.operator+(d)); 

in etwas übersetzen, wo jeder Aufruf operator+ eine Schleife durch die Einträge haben würde. Allerdings würde die natürliche Art und Weise einmal durch alle Elemente in einer Schleife sein und einige zusätzlich wie

a_i = b_i + c_i + d_i 

und das ist das tun, was Ausdruck Vorlagen effektiv tun, indem sie ein epxression nur die Bewertung, wenn das Ergebnis wirklich benötigt wird.

Beachten Sie, dass das temporäre (dh Zwischenergebnis von c+d) nur erforderlich ist, da jedes operator+ separat alle Elemente durchläuft. Sobald die einzelnen Schleifen kombiniert sind, besteht keine Notwendigkeit mehr für ein temporäres.

Für eine weniger amateurhafte Erklärung und mehr Details kann ich Ihnen diese talk from the CppConf 2015 empfehlen.