StringLoader
-
@Mox
Strict aliasing Verletzungen sind mit Compilern wie GCC oder Clang IIRC gar kein "esoterisches" Problem das sich nicht auswirkt, sondern durchaus real.Was das "unnötige Kopieren" angeht: probier doch einfach mal aus was dein Compiler für ein fixed-size 4 oder 8 Byte memcpy (mit Optimierungen) für Code generiert. Normalerweise sollte davon nichts mehr übrig bleiben. (Ausser Source oder Target sind nicht lokale Variablen, dann wird ein Load oder Store oder evtl. sogar ein Load UND ein Store übrig bleiben - das selbe was mit ner Union oder reinterpret_cast auch gebraucht wird.)
-
Gut, wir haben also ein reales Problem. Darf ich fragen, was genau das Problem ist?
Davon ab: Ich habe solche und solche Compiler im Einsatz. Nicht alle optimieren gleich gut. Von daher wollte ich nicht so viel Energie darauf verschwenden, praktisch nicht existierende Probleme zu lösen.
-
-
Frage: "•Is there any way to work around this problem?"
Antwort: "You could use a union to represent the memory you need to reinterpret"
-
Kommentar zur akzeptierten Antwort:
Just a warning, that it's unspecified behaviour to use an union by writing to one member and reading from another, according to the C++ standard. So it may work, it may not.
Bitte auch beachten dass C++ hier andere Regeln als C hat.
Bei C ist der Umweg über ne union offiziell OK. Mit C++ ist er offiziell (=laut Standard) nicht OK. Wobei viele (alle?) C++ Compiler es trotzdem unterstützen.
-
Also mMm. beste Option ist
memcpy
.
Wenn dumemcpy
unbedingt vermeiden willst nimm neunion
.
Auf jeden Fall nichtreinterpret_cast
.
-
hustbaer schrieb:
Also mMm. beste Option ist
memcpy
.
Wenn dumemcpy
unbedingt vermeiden willst nimm neunion
.
Auf jeden Fall nichtreinterpret_cast
.Ich muss zwingend casten. Du hast mir doch weiter oben erklärt, dass ich das Feld pwsz nicht benutzen darf, da ich es nicht beschrieben habe. Also ist das einfach nur noch so da, wegen der Ausrichtung.
Weißt du eigentlich noch, welches Problem Du mir einreden möchtest?
-
Ich will dir gar kein Problem "einreden".
Ich versuche dir klarzumachen was der C++ Standard über den Code sagt den du schreibst.
Welche Variante aus welchem Grund UB ist hab ich auch schon beschrieben.Wenns dich nicht interessiert, dann lass deinen Code so wie er ist.
Wenn schon, dann google die Stichworte die hier gefallen sind einfach selbst.ps: Was ich mit meinem letzten Beitrag gemeint hatte: der
union
-Trick ist "weniger falsch" als derreinterpret_cast
. Oder eben anders gesagt: derreinterpret_cast
ist so ziemlich die schlimmste denkbare Variante.
-
hustbaer schrieb:
Wenn schon, dann google die Stichworte die hier gefallen sind einfach selbst.
Das werde ich ganz sicher nicht tun. Wenn Du hier UB siehst, wirst Du schon Ross und Reiter direkt beim Namen nennen müssen. Ansonsten gehe ich weiter davon aus, dass Du das nicht existierende Problem selber nicht so ganz verstehst. Mit "IIRC" und "vielleicht 'ne Grauzone" und einem Link, der mich bestätigt, überzeugst Du mich jedenfalls nicht.
Aber lassen wir das. Ich mache sowieso was ich meine machen zu müssen.
-
Ja, mach was du willst. Interessiert mich nicht wirklich. Wenn du mir nix glauben willst, dann lass es halt.
Ich hoffe ich muss nie Code von dir warten.
-
hustbaer schrieb:
Ich hoffe ich muss nie Code von dir warten.
Na klar, der musste noch kommen. Selber keine Ahnung, aber immer feste drauf. Vollidiot.
-
-
Freund Mox, der der keine Ahnung hat, bist du.
Aber klar. Weil ich mir bei einem sehr spezifischen Punkt nicht sicher bin, und es auch noch gewagt habe darauf hinzuweisen, hab ich keine Ahnung. Du spinnst ja.
ps: Und der Link bestätigt dich nicht. Du träumst halt nur und ignorierst alles was dir nicht in den Kram passt, wie z.B.
hustbaer schrieb:
Kommentar zur akzeptierten Antwort:
Just a warning, that it's unspecified behaviour to use an union by writing to one member and reading from another, according to the C++ standard. So it may work, it may not.
Bitte auch beachten dass C++ hier andere Regeln als C hat.
Bei C ist der Umweg über ne union offiziell OK. Mit C++ ist er offiziell (=laut Standard) nicht OK. Wobei viele (alle?) C++ Compiler es trotzdem unterstützen.Und jetzt geh weiter träumen.
-
Wenn selbst reinterpret_cast so unsicher ist, dass es nur dazu taugt, in einen anderen Typ und wieder zurück zum ursprünglichen Typ zu casten, wofür ist das dann in der Praxis noch gut?
-
reinterpret_cast
ist zu wenig zu gebrauchen. Ist jetzt aber auch keine grosse Überraschung. Bzw. sollte keine sein.Das Problem ist dabei aber gar nicht der
reinterpret_cast
selbst, sondern:- Dass ein
WCHAR*
nen anderes (strikteres) alignment requirement haben könnte als einWCHAR[2]
- Dass das Objekt ein
WCHAR[2]
ist, man es aber alsWCHAR*
liest. Was eben nicht erlaubt ist.
reinterpret_cast
hat damit nur insofern zu tun als dass er in diesem Beispiel verwendet wird um den Zeiger zu konvertieren, der dann verwendet wird um den "bösen" Zugriff zu machen.
- Dass ein