Die Frage lautet also: wie greift man verlässlich und warnungsfrei auf die Bits eines float zu?
tl;dr: In C++ leider gar nicht...
Tach auch. Ich muss hier und da float bitweise bearbeiten.
Nur mal rein prinzipiell: Was genau musst du denn in den Bits bearbeiten?
Danke! memcpy() wollte ich natürlich vermeiden, weil der Compiler dann gar keine Chance mehr hat, das Load&Store zu vermeiden.
Du unterschätzt deinen Compiler. Wenn du's mal ausprobierst, wirst du feststellen, dass das
memcpy() zu einem simplen move kompiliert...
[Edit] Im IRC geht gerade die Diskussion los, dass man in einer Union nur auf das Element zugreifen darf, was man zuletzt geschrieben hat. Alles andere wäre ebenso undefiniertes Verhalten. Hm. Es bleibt weiter spannend.
Type punning ist generell UB. Per
union sowieso und
memcpy() in einen
uint32_t wäre imo ebenfalls UB (). Die einzige Vorgehensweise, die man imo als laut Standard potentiell mehr erlaubt als verboten ansehen kann, ist, die Bytes eines Objektes von trivially copyable Type per
memcpy() in ein
char oder
unsigned char Array zu kopieren und dann die einzelnen chars im Array anzuschauen. Aber selbst da begibt man sich imo in eine Grauzone (der Standard sagt imo streng genommen nur, dass man die Bytes dann aus dem Array weiter in ein Objekt des selben Typs kopieren kann und dieses dann den selben Wert wie das ursrüngliche Objekt hat. Dass man dazwischen die Elemente des Arrays anschaut, ist lediglich nicht explizit verboten)...