我最近一直在阅读有关严格混叠的文章。C/C++ 标准说以下代码是无效的(未定义的行为是正确的),因为编译器可能在a
某处缓存了值,并且在我更新时不会识别它需要更新值b
;
float *a;
...
int *b = reinterpret_cast<int*>(a);
*b = 1;
该标准还说char*
可以为任何东西加上别名,因此(如果我错了,请纠正我)编译器会在对char*
变量进行写访问时重新加载所有缓存的值。因此,以下代码将是正确的:
float *a;
...
char *b = reinterpret_cast<char*>(a);
*b = 1;
但是在根本不涉及指针的情况下呢?例如,我有以下代码,GCC 会向我抛出关于严格别名的警告。
float a = 2.4;
int32_t b = reinterpret_cast<int&>(a);
我想要做的只是复制原始值a
,所以不应该应用严格的别名。这里是否存在可能的问题,或者只是 GCC 对此过于谨慎?
编辑
我知道有一个使用memcpy的解决方案,但它导致代码的可读性要差得多,所以我不想使用那个解决方案。
编辑2
int32_t b = *reinterpret_cast<int*>(&a);
也不起作用。
解决了
这似乎是GCC 中的一个错误。