严格别名的性能优势

在C中,观察严格混叠会带来什么样的性能优势?

这里有一个非常彻底地描述别名的页面。

这里和这里也有一些SO主题。

总而言之,当两个不同类型的指针访问同一位置时,编译器不能假设数据的值(即它必须每次都读取该值,因此不能进行优化)。

仅当未强制执行严格别名时才会发生这种情况。 严格的别名选项:

  • gcc: -fstrict-aliasing [default]-fno-strict-aliasing
  • msvc: 默认情况下,严格别名处于关闭状态。 (如果有人知道如何打开它,请说出来。)

将此代码复制粘贴到main.c中:

void f(unsigned u) { unsigned short* const bad = (unsigned short*)&u; } int main(void) { f(5); return 0; } 

然后使用以下选项编译代码:

gcc main.c -Wall -O2

你会得到:

main.c:3:警告:解除引用类型惩罚指针将破坏严格别名规则

禁用别名:

gcc main.c -fno-strict-aliasing -Wall -O2

警告消失了。 (或者只是取出-Wall但……如果没有它就不能编译)

尽我所能我无法让MSVC给我一个警告。