Frage

Gibt es einen Fall, in dem Pass-by-Reference teurer ist als Pass-by-Wert in C ++? Wenn ja, was wäre dieser Fall?

War es hilfreich?

Lösung

Vorziehen, primitive Typen (int, char, float, ...) und schotenstrukturen zu übergeben, die billig zu kopieren (Punkt, komplex) nach Wert sind.

Dies ist effizienter als die Indirektion, die beim Übergang von Referenz erforderlich ist.

Sehen Boosts Anrufmerkmale.

Die Vorlagenklasse call_traits<T> Kapuliert die "beste" Methode, um einen Parameter eines Typs t an oder von einer Funktion zu übergeben, und besteht aus einer Sammlung von Typedefs, die wie in der folgenden Tabelle definiert sind. Der Zweck von call_traits soll sicherstellen, dass Probleme wie "Referenzen auf Referenzen" niemals auftreten und dass Parameter auf die effizienteste Weise übergeben werden.

Andere Tipps

Sie können diesen Artikel lesen "Wollen Sie Geschwindigkeit? Nach Wert passieren" Über Kopie Elision und RVO (Rückgabe nach Wertoptimierung). Es erklärt, dass Referenzen manchmal den Compiler daran hindern, sie zu tun.

Ja, der Zugriff auf ein vom Referenzargument bestandener Übergeben kann mehr Indirektion erfordern als ein von Wertesargument verabschiedetes. Außerdem kann es langsamer sein, wenn die Größe des Arguments kleiner als die Größe eines einzelnen Zeigers ist. Natürlich wird davon ausgegangen, dass der Compiler ihn nicht optimiert.

Der Compiler könnte das Übergeben eines primitiven Typs durch Bezugnahme auf einfaches Bestehen optimieren, wenn der Typ die gleiche Größe oder kleiner als die Größe eines Referenz/Zeigers hat. Es gibt keine Garantie, dass der Compiler dies tut. Wenn Sie also die Wahl haben, bestehen Sie primitive Typen nach Wert. In dem Vorlagencode müssen Sie jedoch ohnehin ohnehin nach Referenz übergeben - betrachten Sie Vector's Push_back, der eine CONT -Referenz nimmt. Wenn Sie einen Vektor von INTs haben, würden Sie einen Verweis auf einen primitiven Typ weitergeben. In dieser Situation hoffen Sie, dass der Compiler dies optimieren würde, indem sie die Referenz durch einen Wert ersetzen. Da der Vektor jedoch große Typen speichert, ist es die beste Wahl, eine Const -Referenz zu akzeptieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top