Avatar ·

什么是C++中的严格别名规则(strict aliasing rule)以及它如何破坏代码?

大家好。我写C++大约一年了,最近遇到了一个奇怪的问题。我有一个函数,它接受两个不同类型的指针,我期望它通过一个指针修改值,然后通过另一个指针读取它。下面是一个简化的例子: ```cpp #include void foo(int* a, float* b) { *a = 42; *b = 3.14f; std::cout << *a; // 期望输出42,但得到0或垃圾值 } int main() { int x = 10; // 我进行强制转换,将int内存解释为float foo(&x, reinterpret_cast(&x)); return 0; } ``` 我期望在写入`*a = 42`和`*b = 3.14f`后,`*a`的值应该是42,但输出了一些奇怪的东西。编译器(带有-O2的GCC)表现得好像我对`*b`的写入不影响`*a`。我听说过“严格别名规则”,但我不明白这个规则具体如何工作以及如何绕过它。为什么编译器会优化我的代码,导致它出错?以及如何正确地在不同类型之间使用reinterpret_cast?