„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 |
|
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 |
|
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!