Heim > Backend-Entwicklung > C++ > Ist „Willst du Geschwindigkeit? Übergeben nach Wert' immer wahr: Wann ist die Übergabe nach Referenz besser als die Übergabe nach Wert?

Ist „Willst du Geschwindigkeit? Übergeben nach Wert' immer wahr: Wann ist die Übergabe nach Referenz besser als die Übergabe nach Wert?

Barbara Streisand
Freigeben: 2024-10-26 17:09:03
Original
819 Leute haben es durchsucht

Is

„Wollen Sie Geschwindigkeit? Pass by Value“ und Leistungsoptimierung

Beim Umgang mit kopierintensiven Vorgängen streben Entwickler häufig danach, die Leistung zu optimieren. Diese Prämisse hat zu dem von Scott Meyers geprägten Axiom „Willst du Geschwindigkeit? Pass by Value“ geführt. Diese Vorstellung wirft jedoch die Frage auf: Bietet die Wertübergabe immer einen Leistungsvorteil gegenüber der Referenzübergabe?

Unter Berücksichtigung der folgenden Klassen X und Y:

1

2

3

4

5

6

7

8

9

10

11

<code class="cpp">struct X {

    std::string mem_name;

 

    X(std::string name) : mem_name(std::move(name)) {}

};

 

struct Y {

    std::string mem_name;

 

    Y(const std::string& name) : mem_name(name) {}

};</code>

Nach dem Login kopieren

In X der Konstruktor Nimmt eine Kopie des Arguments und verwendet den Move-Konstruktor, um seine Mitgliedsvariable mem_name zu initialisieren. In Y nimmt der Konstruktor eine const-Referenz und initialisiert mem_name direkt aus dem Argument.

Nun untersuchen wir ein Szenario, in dem wir diese Klassen verwenden:

1

2

3

4

5

6

<code class="cpp">std::string foo() { return "a" + std::string("b"); }

 

int main() {

    X(foo());

    Y(foo());

}</code>

Nach dem Login kopieren

Funktion foo() gibt a zurück temporärer Wert, der zum Initialisieren von name in X und mem_name in Y verwendet wird.

Im Fall von X kann der Compiler die Konstruktion von foo() optimieren und seinen Rückgabewert direkt in name platzieren. Anschließend wird der Name in mem_name verschoben. Dieser Vorgang führt zu einem einzigen Zug ohne Kopie.

Im Gegensatz dazu kann Y diese Optimierung nicht durchführen. Es bindet den temporären Rückgabewert von foo() an seinen Referenznamen und kopiert diesen Wert dann in mem_name. Daher führt Y eine Kopie durch.

Zusammenfassend lässt sich sagen, dass bei der Übergabe eines R-Werts (temporäres Objekt) die Übergabe als Wert in Kopie. Es ist jedoch wichtig zu beachten, dass diese Optimierung von den Fähigkeiten des Compilers abhängt und eine Profilierung immer ratsam ist, um die tatsächlichen Auswirkungen auf die Leistung zu ermitteln.

Das obige ist der detaillierte Inhalt vonIst „Willst du Geschwindigkeit? Übergeben nach Wert' immer wahr: Wann ist die Übergabe nach Referenz besser als die Übergabe nach Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage