严格别名的性能优势
在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给我一个警告。