2010-01-21 5 views

Antwort

15

Bevorzugen Sie primitive Typen (int, char, float, ...) und POD-Strukturen, die nach Wert zu kopieren sind (Point, complex).

Dies ist effizienter als die Umleitung, die bei der Referenzübergabe erforderlich ist.

Siehe Boost's Call Traits.

Die Template-Klasse call_traits<T> kapselt das „beste“ Verfahren einen Parameter eines Typ T zu oder von einer Funktion zu übergeben, und besteht aus einer Sammlung von typedefs wie in der Tabelle unten definiert. Der Zweck von call_traits ist es, sicherzustellen, dass Probleme wie "Referenzen auf Referenzen" nie auftreten, und dass Parameter auf möglichst effiziente Weise übergeben werden.

4

Ja, der Zugriff auf ein Argument "by by reference" erfordert möglicherweise mehr Dereferenzierungsebenen als ein Argument "by by value". Außerdem ist es möglicherweise langsamer, wenn die Größe des Arguments kleiner als die Größe eines einzelnen Zeigers ist. Natürlich geht alles davon aus, dass der Compiler es nicht optimiert.

+0

Also wie kann man herausfinden, ob sein Compiler das optimiert? – Arthur

+2

Durch den Blick auf den Binärcode –

7

Sie können diesen Artikel "Want speed ? Pass by value" über Kopie Elision und RVO (Return by Value Optimization) lesen. Es erklärt, dass Referenzen manchmal verhindern, dass der Compiler sie ausführt.

1

Der Compiler könnte die Übergabe eines primitiven Typs durch Verweis auf die einfache Übergabe nach Wert optimieren, wenn der Typ dieselbe Größe oder kleiner als die Größe eines Verweises/Zeigers ist. Es gibt keine Garantie dafür, dass der Compiler dies tut. Wenn Sie also eine Wahl haben, übergeben Sie primitive Typen nach Wert. In Templated-Code müssen Sie jedoch oft als Referenz übergeben werden - betrachten Sie push_back von vector, das eine const-Referenz verwendet. Wenn Sie einen Vektor von Ints haben, übergeben Sie einen Verweis auf einen primitiven Typ. In dieser Situation würden Sie hoffen, dass der Compiler dies optimieren würde, indem Sie die Referenz durch einen Wert ersetzen. Da der Vektor jedoch große Typen speichern kann, ist die Annahme einer Konst-Referenz die beste Wahl.

+0

"Der Compiler könnte optimieren ..." solange der Angerufene den Referand nicht ändert, oder lesen Sie es nach dem Aufruf von Code, der es ändern könnte. Aber natürlich würde man in solchen Fällen hoffentlich nicht die Frage stellen: "Was teurer ist", sondern "was richtig ist" :-) Die peinlichen Fälle sind Fälle, in denen man denkt, dass der Compiler optimieren kann, aber eigentlich auch kann nicht, weil Sie einige Gründe übersehen haben, dass es eine Referenz sein muss (Aliasregeln sind die Hauptursache für Überraschungen). –