memcpy wird halt meiner Erfahrung nach gelegentlich nicht wegoptimiert was in den Fällen einem Weltuntergang in Hinsicht auf Performance gleichkommt.
Nun, ich brauch das fast nie, aber alle Compilern, die ich getestet hab (MSVC, gcc, clang, icc), haben mir mein
memcpy() zu einem move optimiert und, zumindest so lange Quelle und Ziel sich im lokalen Scope befinden, wäre ich
wirklich schwer überrascht, wenn ein Compiler das plötzlich nicht mehr machen würde...
Die Frage ist, was sind dann die Alternativen? Und nicht immer möchte oder kann man SSE Intrinsics verwenden, die die Portabilität übrigens noch deutlich verschlechtern.
Naja, wenn man Portabilität will, ist
memcpy() imo die einzig akzeptable Lösung. Da es im konkreten Fall um das – vermutlich möglichst flotte – Bearbeiten eines Bitstream sowie Konvertieren zwischen half und single precision float geht, ist SSE imo schwer zu empfehlen, da das mehr Daten schaufeln kann und entsprechende Instructions hat. Zwar ist SSE natürlich Architekturspezifisch, die Intrinsics an sich aber zwischen Compilern/Plattformen portabel...
Das Verletzen von Strict Aliasing ist mit may_alias explixit erlaubt.
Naja, das ist aber sogar noch weniger portabel als so manche Intrinsics...