严格别名的性能优势

时间:2009-04-16 06:11:04

标签: c performance

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

1 个答案:

答案 0 :(得分:19)

有一个页面可以非常彻底地描述别名here

还有一些SO主题herehere

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

只有在未强制执行严格别名时才会出现这种情况。严格的别名选项:

  • gcc: -fstrict-aliasing [默认] -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给我一个警告。