Avatar ·

Was ist die Strict-Aliasing-Regel in C++ und wie bricht sie Code?

Hallo zusammen. Ich schreibe seit etwa einem Jahr C++ und bin kürzlich auf ein seltsames Problem gestoßen. Ich habe eine Funktion, die zwei Zeiger unterschiedlichen Typs akzeptiert, und ich erwarte, dass sie einen Wert über einen Zeiger ändert und ihn dann über den anderen liest. Hier ist ein vereinfachtes Beispiel: ```cpp #include void foo(int* a, float* b) { *a = 42; *b = 3.14f; std::cout << *a; // erwarte 42, bekomme aber 0 oder Müll } int main() { int x = 10; // Ich caste, um den int-Speicher als float zu interpretieren foo(&x, reinterpret_cast(&x)); return 0; } ``` Ich erwarte, dass nach dem Schreiben von `*a = 42` und `*b = 3.14f` der Wert von `*a` 42 sein sollte, aber es wird etwas Seltsames ausgegeben. Der Compiler (GCC mit -O2) verhält sich so, als ob mein Schreiben in `*b` keinen Einfluss auf `*a` hätte. Ich habe von der "strict aliasing rule" gehört, verstehe aber nicht, wie genau diese Regel funktioniert und wie man sie umgeht. Warum optimiert der Compiler meinen Code und bricht ihn damit? Und wie macht man reinterpret_cast zwischen verschiedenen Typen richtig?