Guten Abend!
Ich finde die std::string-Klasse ziemlich interessant, da sie sehr flexibel ist und gefühlt unendlich viele Einsatzmöglichkeiten bietet. Mal eben schnell eine Edit Box nach einem Text durchsuchen? std::string::find! Wobei man hier wohl eher den wide-string benutzen sollte. Wie dem auch sei. Mich interessiert, wie to_string arbeitet. Ich habe mal versucht, selbst eine Konvertierungsfunktion zu schreiben und dies mit einer for-Schleife gemacht, in der ich einen char so lange hoch zähle, bis er die gegebene int-Zahl erreicht hat.
Ich kann mir kaum vorstellen, dass std::to_string das genauso macht. Weiß vielleicht einer genauer darüber Bescheid? Man wird ja im Memory irgendwo die Zahl in Binärschreibweise liegen haben. Ich glaube, dass int direkt binär abspeichert. Also die Zahl 12 würde dann als "0000 1100" abgespeichert werden. Würde man die Zahl 12 (12'xx') als char anzeigen lassen, bekäme man nicht die 12, sondern den Charakter, mit dem Code 12. Und da ist ja das Problem. Wie bekommt man den int-Wert als char(xx'12') interpretiert. Dafür bieten C und C++ zahlreiche Konvertierungsmöglichkeiten, aber damit versteht man als Amateur nicht, was da im Hintergrund abläuft.
Ich hoffe, es kann da jemand Licht ins Dunkle bringen
Edit: Das muss doch irgendwie mit Schleifen gemacht werden. Wenn man mal überlegt, wie Literale abgelegt werden, könnte man darauf schließen. Literale werden in der .data-Sektion abgelegt (ich hoffe ich habe die richtige Sektion erwischt). Kopiert man einen Literal bspw. als const char* in einen char*, wird auch dieser im Klar-text- irgendwo im Binärcode angezeigt.
Auch integer-Literale werden im Klartext in der .data-Sektion abgelegt, dieses mal aber nicht als Text, sondern als binäre Zahl. Man kann also nur einen Zahlenwert in einen Text umwandeln, indem man diesen Zahlenwert Schritt für Schritt auseinander nimmt (bspw. mehrfach durch 10 teilt), um nach und nach auf die einzelnen Ziffern zu kommen und diese dann als char abzuspeichern.
Bliebe nur noch die Frage, wie stringstream arbeitet. Wenn man bspw. eine HWND hWnd Adresse (völlig banales Beispiel) in einen string umwandeln möchte (der dann ja irgendwas wie "0x123456789" beinhalten würde), müsste der stringstream erkennen, dass es sich nicht um eine reine Zahl handelt (sondern um eine Hexadezimal mit dem Präfix 0x vorne dran). Aber vielleicht lässt es sich ja irgendwie erkennen, ob etwas nur eine Pointer-Adresse ist. Ob auch hier mit Schleifen gearbeitet wird? Schlägt das nicht arg auf die performance, wenn man einen ellenlangen input hat? Ich habe noch nie ausprobiert, einen stringstream mal mit etwas sehr großem zu füttern und zu schauen, wie lange die Umwandlung insgesamt dauert. Wobei man wohl nie eine so riesige Zahl haben kann, sodass eine Schleife ewig ackern müsste. Man könnte es ja auch so staffeln, dass man prüft, ob die Zahl ziemlich hoch ist, um dann nicht nur durch 10 sondern vielleicht durch >100 zu teilen. Alle andere inputs werden wohl über Überladungen abgefangen und dann anders behandelt. Wenn ich schon etwas im char-Format habe, brauche ich es ja nicht mehr umzuwandeln.
Ich finde die std::string-Klasse ziemlich interessant, da sie sehr flexibel ist und gefühlt unendlich viele Einsatzmöglichkeiten bietet. Mal eben schnell eine Edit Box nach einem Text durchsuchen? std::string::find! Wobei man hier wohl eher den wide-string benutzen sollte. Wie dem auch sei. Mich interessiert, wie to_string arbeitet. Ich habe mal versucht, selbst eine Konvertierungsfunktion zu schreiben und dies mit einer for-Schleife gemacht, in der ich einen char so lange hoch zähle, bis er die gegebene int-Zahl erreicht hat.
Ich kann mir kaum vorstellen, dass std::to_string das genauso macht. Weiß vielleicht einer genauer darüber Bescheid? Man wird ja im Memory irgendwo die Zahl in Binärschreibweise liegen haben. Ich glaube, dass int direkt binär abspeichert. Also die Zahl 12 würde dann als "0000 1100" abgespeichert werden. Würde man die Zahl 12 (12'xx') als char anzeigen lassen, bekäme man nicht die 12, sondern den Charakter, mit dem Code 12. Und da ist ja das Problem. Wie bekommt man den int-Wert als char(xx'12') interpretiert. Dafür bieten C und C++ zahlreiche Konvertierungsmöglichkeiten, aber damit versteht man als Amateur nicht, was da im Hintergrund abläuft.
Ich hoffe, es kann da jemand Licht ins Dunkle bringen
Edit: Das muss doch irgendwie mit Schleifen gemacht werden. Wenn man mal überlegt, wie Literale abgelegt werden, könnte man darauf schließen. Literale werden in der .data-Sektion abgelegt (ich hoffe ich habe die richtige Sektion erwischt). Kopiert man einen Literal bspw. als const char* in einen char*, wird auch dieser im Klar-text- irgendwo im Binärcode angezeigt.
Auch integer-Literale werden im Klartext in der .data-Sektion abgelegt, dieses mal aber nicht als Text, sondern als binäre Zahl. Man kann also nur einen Zahlenwert in einen Text umwandeln, indem man diesen Zahlenwert Schritt für Schritt auseinander nimmt (bspw. mehrfach durch 10 teilt), um nach und nach auf die einzelnen Ziffern zu kommen und diese dann als char abzuspeichern.
Bliebe nur noch die Frage, wie stringstream arbeitet. Wenn man bspw. eine HWND hWnd Adresse (völlig banales Beispiel) in einen string umwandeln möchte (der dann ja irgendwas wie "0x123456789" beinhalten würde), müsste der stringstream erkennen, dass es sich nicht um eine reine Zahl handelt (sondern um eine Hexadezimal mit dem Präfix 0x vorne dran). Aber vielleicht lässt es sich ja irgendwie erkennen, ob etwas nur eine Pointer-Adresse ist. Ob auch hier mit Schleifen gearbeitet wird? Schlägt das nicht arg auf die performance, wenn man einen ellenlangen input hat? Ich habe noch nie ausprobiert, einen stringstream mal mit etwas sehr großem zu füttern und zu schauen, wie lange die Umwandlung insgesamt dauert. Wobei man wohl nie eine so riesige Zahl haben kann, sodass eine Schleife ewig ackern müsste. Man könnte es ja auch so staffeln, dass man prüft, ob die Zahl ziemlich hoch ist, um dann nicht nur durch 10 sondern vielleicht durch >100 zu teilen. Alle andere inputs werden wohl über Überladungen abgefangen und dann anders behandelt. Wenn ich schon etwas im char-Format habe, brauche ich es ja nicht mehr umzuwandeln.
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „rwCapt“ ()