Sollte ich immer eine Std :: String durch const Verweis auf eine Funktion übergeben, wenn alles, was innerhalb dieser Funktion getan wird, ist, diese Zeichenfolge zu kopieren? Was ist der Unterschied (perf oder anders) zwischen der Übergabe nach Wert und der Weitergabe als Referenz? Wie ich es verstehe, benutzt man operator=
und den anderen Kopierkonstruktor. Ist das der Fall?Wie sollte ich eine Std :: String an eine Funktion übergeben?
Antwort
Sollte ich immer eine std :: string durch const Verweis auf eine Funktion übergeben, wenn alles, was innerhalb dieser Funktion getan wird, ist, diese Zeichenfolge zu kopieren?
Nein. Wenn Sie nur die Zeichenfolge innerhalb der Funktion kopieren, sollten Sie nach Wert übergeben. Dies ermöglicht dem Compiler mehrere Optimierungen durchzuführen. Für mehr lesen Sie Dave Abrahams "Want Speed? Pass by Value."
Was ist der Unterschied (perf oder anders) zwischen der Weitergabe von Wert und der Weitergabe durch Referenz? Soweit ich weiß, benutzt man operator = und den anderen Copy-Konstruktor. Ist das der Fall?
Nein, das ist überhaupt nicht der Fall. Eine Referenz ist kein Objekt; es ist eine Referenz auf ein Objekt. Wenn Sie den Wert übergeben, wird eine Kopie des übergebenen Objekts erstellt. Wenn Sie als Referenz übergeben werden, wird ein Verweis auf das vorhandene Objekt erstellt, und es gibt keine Kopie. A good introductory C++ book wird diese grundlegenden Konzepte im Detail erklären. Es ist wichtig, die Grundlagen zu verstehen, wenn Sie Software in C++ entwickeln möchten.
Ich denke, es hängt davon ab, was er meint, indem man eine Kopie macht. Wenn es sich beispielsweise um ein Mitglied handelt, sollte es als Referenz übergeben und einfach in das Mitglied kopiert werden. In C++ 0x tun Sie es nach Wert und 'std :: move' es in das Mitglied. – GManNickG
Anstelle von std :: move könnten Sie die swap-Methode (oder std :: swap) verwenden, um ein ähnliches Verhalten zu erhalten, wenn Sie C++ 0x nicht verwenden können – Grizzly
Gibt es eine Kombination aus Compiler und Beispiel Code, bei dem die Wertübergabe tatsächlich besser ist? Ich würde gerne wissen. –
Glauben Sie nicht alles, was Sie im Internet lesen. Es ist besser const Referenz zu übergeben. Geben Beweis, schrieb ich ein Testprogramm ...
test.cpp:
#include <ctime>
#include <iostream>
#include <string>
void foo(std::string s);
void bar(const std::string& s);
int main() {
const std::string s("test string");
clock_t start = clock();
for (int it = 0; it < 1000000; ++it)
foo(s);
std::cout << "foo took " << (clock() - start) << " cycles" << std::endl;
start = clock();
for (int it = 0; it < 1000000; ++it)
bar(s);
std::cout << "bar took " << (clock() - start) << " cycles" << std::endl;
}
aux.cpp:
#include <string>
std::string mystring;
void foo(std::string s) { mystring = s; }
void bar(const std::string& s) { mystring = s; }
Zusammengestellt mit ‚g ++ O3 test.cpp aux.cpp 'und bekam den Ausdruck:
foo took 93044 cycles
bar took 10245 cycles
Das Überschreiten der Referenz ist um eine Größenordnung schneller.
- 1. Sollte ich eine Std :: Funktion durch Const-Referenz übergeben?
- 2. eine Stringliteral an eine Funktion, die eine std :: string &
- 3. Wie kann ich eine Memberfunktion an eine std :: -Funktion binden?
- 4. Wie eine Liste von Pfaden an eine Funktion übergeben?
- 5. Wie kann ich hier eine Variable an eine Funktion übergeben?
- 6. wie ein std :: bind Objekt an eine Funktion
- 7. Linq-Ausdruck an eine Funktion übergeben
- 8. Warum kann ich kein Lambda an diese Funktion übergeben, die eine std :: -Funktion hat?
- 9. Ein int an eine std :: string anhängen
- 10. Kann ich einen Parameter an eine std :: vector Sortierfunktion übergeben?
- 11. 2 Werte an eine Javascript Funktion übergeben
- 12. Wie kann ich Objekte an eine exponierte Luaj-Funktion übergeben?
- 13. Wie kann ich eine Funktion an ein Perl Sub übergeben?
- 14. Wie viele Argumente kann ich an eine Bash-Funktion übergeben?
- 15. SWIG: Wie umbrechen std :: string & (std :: String übergeben durch Verweis)
- 16. Wie eine generische Eigenschaft als Parameter an eine Funktion übergeben?
- 17. Kopiert der Compiler eine std :: string in den Stapel, während er an eine Funktion in C++ übergeben wird?
- 18. std :: an eine std :: -Funktion binden stürzt mit Clang ab
- 19. Sollte ich meine $ mysqli Variable an jede Funktion übergeben?
- 20. Wie übergebe ich eine Funktion an Enum.each?
- 21. R: Ausdruck an eine innere Funktion übergeben
- 22. Array an eine andere Funktion übergeben
- 23. Übergeben Sie eine Funktion an einen #Selector
- 24. Einen $ scope Wert an eine Funktion übergeben
- 25. Übergeben von Mehrwortargumenten an eine Bash-Funktion
- 26. Wie sollte ich eine std :: function-Variable mit Standardargumenten definieren?
- 27. Funktionsargumente an eine innere Funktion übergeben?
- 28. Eine Methode an eine andere Methode übergeben
- 29. Enumerationswerte an eine Funktion in PowerShell übergeben
- 30. Einen Zeiger an eine Funktion übergeben und dann in eine andere Funktion einfügen
Wenn Sie als Referenz übergeben werden, wird keine Kopie erstellt. Wenn Sie den Wert übergeben, wird der Kopierkonstruktor verwendet. – Anycorn