Ich bin verwirrt darüber, ob das eine strenge Aliasing-Verletzung ist oder nicht und ruft nicht definiert Verhalten auf. Mehrere Leute haben mir gesagt, dass es keine Verletzung ist und dass es keine UB gibt, aber aus dem Lesen der C++ - Spezifikation klingt es nach irgendetwas, das einen typgegossenen Zeiger dereferenziert (es sei denn, es wurde nur cv-casted oder casted zu einem kompatiblen Typ oder char) ist UB.Strict Aliasing char * zu einem breiteren Typ ohne undefiniertes Verhalten
#define SWAP(x) (((x) << 8) | ((x) >> 8)))
char* foo(char* data, size_t len16) {
int align = reinterpret_cast<uintptr_t>(data) % sizeof(uint16_t);
if (align == 0) {
uint16_t* data16 = reinterpret_cast<uint16_t*>(data);
for (size_t i = 0; i < len16; i++) {
data16[i] = SWAP(data16[i]);
}
} else {
throw "Unaligned";
}
return data;
}
(Dies ist eine etwas konstruiertes Beispiel, in Wirklichkeit SWAP
eine Fremd Funktion sein, die eine uint16_t
erfordert.)
Ist die Geschichte verändert, weil wir die Ausrichtung überprüft haben , sind Sie sich über die Größe der Typen sicher und kümmern sich nicht um Endianness? Die verbleibende Sorge wäre, glaube ich, eine tote Code-Eliminierung durch den Optimierer.
Wenn dies illegal ist, wie würden Sie effizient einen char
Puffer (z. B. aus einer Datei) als seinen beabsichtigten Typ interpretieren (z. B. int16
s)? Ich kenne durch eine Vereinigung Gießen, aber ich weiß wirklich nicht, wie das ist anders (siehe casting through a union(1), abgesehen von sagen dem Compiler, dass es nicht Beseitigung von totem Code tun können.
Warum der Downvote? Bitte lass ein Kommentar da. – ZachB