严格别名的性能优势

17 c performance

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

GMa*_*ckG 19

存在描述混叠得很彻底页面在这里.

这里这里也有一些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;
}
Run Code Online (Sandbox Code Playgroud)

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

gcc main.c -Wall -O2

你会得到:

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

禁用别名:

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

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

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

  • 关于应用基于类型的别名在多大程度上提供了"限制"无法获得的性能优势,已经进行了多少研究?您的第一篇链接文章建议"如果一个程序需要`-fno-strict-alias`,那么应该认为程序员可能不打算使用`restrict`,但是如果`restrict`可以提供基于类型的所有性能优势没有语义限制的别名,为什么不能禁用基于类型的别名,特别是考虑到无法知道gcc对规则的解释将来如何变化? (3认同)