C++ Wörter auslesen
-
@Swordfish sagte in C++ Wörter auslesen:
#include <iostream> #include <string> int main() { std::cout << "Gib' \"help\" ein und drueck' Enter: "; std::string input; std::cin >> input; if (input == "help") std::cout << "ein neuer text\n"; }
und nu?
Ich würde ja mal behaupten, dass er gerne die Program Args parsen möchte
-
#include <iostream> #include <cstring> int main(int argc, char **argv) { if (argc == 2 && std::strcmp(argv[1], "help") == 0) std::cout << "ein neuer text\n"; }
und nu?
-
@Swordfish sagte in C++ Wörter auslesen:
#include <iostream> #include <cstring> int main(int argc, char **argv) { if (argc == 2 && strcmp(argv[1], "help") == 0) std::cout << "ein neuer text\n"; }
und nu?
ihgitt Kein c++17 bei dir verfügbar?
Dachte eher an sowas hier#include <iostream> #include <string_view> int main(int argc, char **argv) { if (argc == 2 && std::string_view(argv[1]) == "help") std::cout << "ein neuer text\n"; }
-
@DNKpp sagte in C++ Wörter auslesen:
std::string_view(argv[1]) == "help"
und was macht das anders als
std::strcmp()
außer daß noch ein extra Objekt konstruktioniert werden muss?
-
- Du nutzt kein std::strcmp
- ist das immer noch eine c Funktion
- Das Konstruieren wird sehr wahrscheinlich keinen Unterschied machen
- Willkommen in der Zukunft
Edit: Es macht wohl einen Unterschied!
https://godbolt.org/z/nEhra9
-
@DNKpp sagte in C++ Wörter auslesen:
Edit: Es macht wohl einen Unterschied!
Wo macht das einen Unterschied?
-
@Mechanics sagte in C++ Wörter auslesen:
@DNKpp sagte in C++ Wörter auslesen:
Edit: Es macht wohl einen Unterschied!
Wo macht das einen Unterschied?
Schlecht ausgedrückt. Das Konstruieren selbst macht natürlich keinen. Bin jetzt kein wirklicher ASM Experte, vorallem da die Codes string_view zu strcmp ein wenig anders geordnet werden (und ich auch der Colorierung nicht ganz traue) aber es sieht so aus, als sei die string_view Variante mindestens gleich gut, wenn nicht sogar die effizientere. Wie gesagt, naive Sichtweise. Darf mich gerne jemand aufklären.
-
@DNKpp sagte in C++ Wörter auslesen:
Du nutzt kein std::strcmp
ist das immer noch eine c Funktiontroll dich
-
Beide Funktonen springen zu dem gleichen Code. Da ist nur der erste Vergleich vorher.
-
@Mechanics Äh, nein. g++ macht aus der
string_view
mitoperator==
-Version einen Integervergleich.@DNKpp Steht aber nirgends geschrieben daß ein Compiler das für die
strcmp
-Version nicht genauso machen dürfte.Sinnlose Diskussion.
-
@Swordfish sagte in C++ Wörter auslesen:
@Mechanics Äh, nein. g++ macht aus der
string_view
mitoperator==
-Version einen Integervergleich.@DNKpp Steht aber nirgends geschrieben daß ein Compiler das für die
strcmp
-Version nicht genauso machen dürfte.Sinnlose Diskussion.
Der Einzige, der hier sinnlos diskutiert bist meiner Meinung nach du. Es ist objekte sicherlich auch verständlicher, wenn ein Vergleich statt eines vagen integers (0 == true, yay!) einen bool returned. Du kennst die Funktion, der OT sicherlich nicht. operator == versteht nunmal jeder. Das einzige was hier für dich und
strcmp
spricht, ist deine Trotzigkeit. C++ hat mittlerweile die Tools um auf diese c Relikte zu verzichten, also sollte man sie auch nutzen. Aber das sollte ich dir eigentlich nicht erzählen müssen.Achja, und den Troll darfst du gerne stecken lassen.
-
@DNKpp Whatever.
-
@DNKpp sagte in C++ Wörter auslesen:
@Mechanics sagte in C++ Wörter auslesen:
@DNKpp sagte in C++ Wörter auslesen:
Edit: Es macht wohl einen Unterschied!
Wo macht das einen Unterschied?
Schlecht ausgedrückt. Das Konstruieren selbst macht natürlich keinen.
Wenn ich das richtig sehe, dann macht er in der ASM-Zeile 31 für den
string_view
noch einenstrlen
-Aufruf. Das hätte ich erstmal auch nicht so erwartet, aber wenn man drüber nachdenkt macht es Sinn. Derstring_view
muss schliesslich die Länge des Strings kennen und die muss bei einem blanken C-String natürlich erstmal ermittelt werden - auch wenn das OS die Länge des Arguments kennt, aber sie wird ja leider nicht an diemain
weitergereicht.strcmp
braucht die Länge nicht, dass stoppt einfach beim'\0'
-Zeichen, wann immer das kommt. Das Konstruieren desstring_view
wäre eigentlich kein Problem, wenn die Länge bekannt wäre. Dann würde das garantiert zu etwasstrcmp
-Äquivalentem und sonst nichts weiter optimiert werden (vomstrlen
-Call abgesehen passiert das hier ja auch).Der
JMP
zustd::__ostream_insert
ist übrigens lediglich ein "cout
"-Tailcall. Lustig finde ich allerdings die Optimierung mit demcmp DWORD PTR [rbx], 1886152040
in Zeile 38.1886152040 = 0x706c6568 = (uint32_t) 'help'
. Daher gibts auch keinenstrcmp
-Loop wie in Zeile 14 mitrepz cmpsb
. Der Vergleich mit dem ganzen String am Stück in einem 32-Bit Wert dürfte einen winzigen Tick effizenter sein als mit derrepz
-Schleife Byte für Byte zu vergleichen - leider macht das zusätzlichestrlen
jeden potentiellen Vorteil dieser hübschen Optimierung wieder kaputt
-
@Finnegan sagte in C++ Wörter auslesen:
@DNKpp sagte in C++ Wörter auslesen:
@Mechanics sagte in C++ Wörter auslesen:
@DNKpp sagte in C++ Wörter auslesen:
Edit: Es macht wohl einen Unterschied!
Wo macht das einen Unterschied?
Schlecht ausgedrückt. Das Konstruieren selbst macht natürlich keinen.
Wenn ich das richtig sehe, dann macht er in der ASM-Zeile 31 für den
string_view
noch einenstrlen
-Aufruf. Das hätte ich erstmal auch nicht so erwartet, aber wenn man drüber nachdenkt macht es Sinn. Derstring_view
muss schliesslich die Länge des Strings kennen und die muss bei einem blanken C-String natürlich erstmal ermittelt werden - auch wenn das OS die Länge des Arguments kennt, aber sie wird ja leider nicht an diemain
weitergereicht.strcmp
braucht die Länge nicht, dass stoppt einfach beim'\0'
-Zeichen, wann immer das kommt. Das Konstruieren desstring_view
wäre eigentlich kein Problem, wenn die Länge bekannt wäre. Dann würde das garantiert zu etwasstrcmp
-Äquivalentem und sonst nichts weiter optimiert werden (vomstrlen
-Call abgesehen passiert das hier ja auch).Der
JMP
zustd::__ostream_insert
ist übrigens lediglich ein "cout
"-Tailcall. Lustig finde ich allerdings die Optimierung mit demcmp DWORD PTR [rbx], 1886152040
in Zeile 38.1886152040 = 0x706c6568 = (uint32_t) 'help'
. Daher gibts auch keinenstrcmp
-Loop wie in Zeile 14 mitrepz cmpsb
. Der Vergleich mit dem ganzen String am Stück in einem 32-Bit Wert dürfte einen winzigen Tick effizenter sein als mit derrepz
-Schleife Byte für Byte zu vergleichen - leider macht das zusätzlichestrlen
jeden potentiellen Vorteil dieser hübschen Optimierung wieder kaputtVielen Dank für deine ausführliche Antwort. Das strlen hatte ich tatsächlich auch schon entdeckt, konnte das aber nicht genau zuordnen. Aber macht schon Sinn, was du sagst.
Festhalten lässt sich dementsprechend, dass ich mich bzgl Performance ein wenig zu weit aus dem Fenster gelehnt habe. Nichts desto trotz stehe ich zu der Meinung, dass man Neulinge nicht mit c Relikten konfrontieren sollte, wenn es andere, Syntaktisch intuitivere, Varianten gibt. Command Line Args parsen wird wohl selten zum Hot-Path des Programms werden und dementsprechend sehe ich da Ausdrucksstärke höher gewichtet als potentiell marginale Performance-Gewinne. Generell könnte man sowas mal profilen.Habs jetzt direkt mal versucht. Die Resultate sind weird. Auf clang ist string_view ein Stückchen langsamer, auf gcc allerdings fast 5 mal so schnell wie die strcmp Variante. Ich befürchte allerdings, dass da irgendwas weg-optimiert wird.
https://quick-bench.com/q/dzcKmfNPhxZmzyr_fDME_W-J6Ag
-
@DNKpp sagte in C++ Wörter auslesen:
Die Resultate sind weird. Auf clang ist string_view ein Stückchen langsamer, auf gcc allerdings fast 5 mal so schnell wie die strcmp Variante.
Das kannst gerne im Compiler- und IDE-Forum diskutieren.
-
@Swordfish sagte in C++ Wörter auslesen:
@Mechanics Äh, nein. g++ macht aus der string_view mit operator==-Version einen Integervergleich.
facepalm
Ich konnte gestern L4 und L14 nicht auseinander halten