Ich habe ein Problem, das durch das Brechen der strengen Zeigeraliasingregel verursacht wird. Ich habe eine Art T
, die von einer Vorlage und einigen integralen Typ Int
der gleichen Größe (wie mit sizeof
) kommt. Mein Code im Wesentlichen geschieht Folgendes:Strict-Pointer-Aliasing: Gibt es eine Lösung für ein bestimmtes Problem?
T x = some_other_t;
if (*reinterpret_cast <Int*> (&x) == 0)
...
Da T
einige willkürliche (anders als die Größenbeschränkung) geben, dass ein Konstruktor haben könnte, kann ich nicht eine Vereinigung von T
und Int
machen. (Dies ist nur in C++ 0x erlaubt und wird noch nicht einmal von GCC unterstützt).
Gibt es eine Möglichkeit, den obigen Pseudocode neu zu schreiben, um die Funktionalität zu erhalten und die strenge Aliasing-Regel zu umgehen? Beachten Sie, dass dies eine Vorlage ist, die ich nicht kontrollieren kann T
oder Wert von some_other_t
; Die Zuordnung und der anschließende Vergleich finden innerhalb des Vorlagencodes statt.
(Für die Aufzeichnung begann der obige Code auf GCC brechen 4.5 wenn T
keine Bit-Felder enthält.)
Was Sie versuchen zu tun? Ich kann mir nicht viele Situationen vorstellen, in denen dieser Code sinnvoll ist. Es ist sicherlich nicht gut durch den Standard spezifiziert. Unter der Annahme, dass dieser Hack tatsächlich notwendig ist (was wahrscheinlich nicht der Fall ist), müssen Sie möglicherweise das entsprechende Compiler-Flag verwenden, um das strikte Aliasing zu deaktivieren. – jalf
@jalf: Es ist ein einzigartiger Behälter. Ich markiere leere Positionen mit ganzzahligem 0. Da aber "T" alles sein kann, einschließlich bitweisem 0, muss ich höchstens eine Position als "nicht leer, obwohl es wie leer aussieht" markieren. Der Vergleich ist die Überprüfung, ob "x" so markiert werden soll oder nicht. – doublep
Ich bin nicht klar, wie Sie dieses Problem lösen - wie können Sie mit einem 'reininterpret_cast' die zwei verschiedenen Gründe für die Speicherung von' 0' ignorieren? – Stephen