visual-c++ - Visual C++ 支持 "strict aliasing"吗?

标签 visual-c++ strict-aliasing

我最近惊讶地发现 C 和 C++ 语言标准有“严格别名”规则。本质上,该规则禁止不同类型的变量引用同一内存位置。

举个例子:

char buffer[4] = { 0x55, 0x66, 0x77, 0x88 };
int32 *p = (int32*)&buffer[0]; // illegal because buffer[0] and *p are different types

与我打交道的大多数专业 C++ 开发人员都不熟悉这条规则。根据我的研究,它似乎主要影响 GCC/G++/CLANG 用户。 Visual C++ 是否支持启用/禁用此规则?如果是这样,如何做到这一点?

谢谢

最佳答案

“严格别名”是限制程序而不是编译器的 C++ 规则。由于违反规则是未定义行为,无需诊断,编译器不需要以任何方式支持它。

也就是说,微软在应用优化方面没有那么积极。就在上周,他们才宣布了新的优化器 assumes no signed overflow ,这是 GCC 几年前就已经假设的。严格的别名会破坏一些 Windows header ,因此需要首先修复这些 header 。 (一些类型的行为就好像它们包含union,但它们没有正式定义)

关于visual-c++ - Visual C++ 支持 "strict aliasing"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37176461/

相关文章:

c++ - 用户数据的严格别名和回调

c++ - 将字节数组转换为 POD

c++ - 模板和继承打破了严格的别名规则

c++ win32编辑框光标不闪烁

c++ - strtok_s安全调试警告解决

visual-studio - Visual C++ 无法解析的外部符号 _Direct3DCreate9@4

visual-c++ - 如何在 VC++ 中设计文件观察器/目录观察器?

c++ - 映射问题

c++ - C++ 中的共享内存缓冲区不违反严格的别名规则

c++ - c++11 严格别名规则是否允许通过 char *、char(&)[N]、甚至 std::array<char, N>& 使用 -fstrict-aliasing -Wstrict-aliasing=2 访问 uint64_t?