【问题标题】:Performance benefits of strict aliasing严格混叠的性能优势
【发布时间】:2009-04-16 06:11:04
【问题描述】:

在 C 中,观察严格别名带来的性能优势究竟是什么?

【问题讨论】:

    标签: c performance


    【解决方案1】:

    有一个页面非常彻底地描述了别名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 -墙 -O2

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

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

    【讨论】:

    • +1,但请明确指出,当观察到严格别名时,编译器无法做出该假设。
    • 完美! :) 不幸的是,MSVC++ 似乎没有严格别名的选项。但它确实有 __restrict 和 __declspec(restrict),可以在个别情况下使用。
    • 看起来像一个错字“-fno-strict-aliasing [default] 和 -fno-strict-aliasing” 我猜默认值实际上是 -fstrict-aliasing(至少在现代 GCC 中)而不是比 -fno-strict-aliasing,但无论如何列出的两个 GCC 选项之一应该是 -fstrict-aliasing,现在它们都说 -fno-strict-aliasing。
    • 哈,不错的收获,我很惊讶直到现在没人看到。
    • 关于应用基于类型的别名在多大程度上提供了restrict 无法获得的性能优势,已经进行了多少研究?您的第一篇链接文章建议“如果程序需要-fno-strict-alias,则应该认为程序员可能不会费心使用restrict,但如果restrict 可以提供基于类型的别名的所有性能优势而没有语义限制,为什么不应该禁用基于类型的别名,特别是考虑到没有办法知道 gcc 对规则的解释将来会如何变化?
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2023-03-15
    • 2015-01-31
    • 1970-01-01
    • 2012-01-24
    • 2010-10-20
    • 2011-03-21
    相关资源
    最近更新 更多