代码之家  ›  专栏  ›  技术社区  ›  pmor

GCC:__atomic_always_lock_free使用-O3编译,但不使用-O0编译

  •  0
  • pmor  · 技术社区  · 2 年前

    示例代码:

    int *s;
    
    int foo(void)
    {
      return 4;
    }
    
    int bar(void)
    {
      return __atomic_always_lock_free(foo(), s);
    }
    

    调用:

    $ gcc t0.c -O3 -c
    <nothing>
    
    $ gcc t0.c -O0 -c
    t0.c:10:10: error: non-constant argument 1 to '__atomic_always_lock_free'
    

    有什么想法吗?

    相关: https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html .

    1 回复  |  直到 2 年前
        1
  •  1
  •   Nate Eldredge    2 年前

    这似乎并不奇怪。你链接的文件上说“ size 必须解析为“编译时常量”,因此在传递时可能会出现错误 foo() 但是,如果GCC能够在编译时确定表达式的值,那么它会将其视为编译时常量,即使它不符合语言对常量表达式的基本定义。这可能被视为一种扩展,C17标准在6.6p10中明确允许。

    优化级别与编译器试图在编译时计算表达式的内容有关。关闭优化后,它只做标准要求的基本常量折叠(例如。 2*4 )。通过优化,您可以获得完整的恒定传播过程以及函数内联的好处。

    所以在本质上 -O0 ,编译器没有注意到这一点 foo() 总是返回相同的值,因为您已经禁用了允许它得出该结论的优化。具有 -O3 它确实如此,所以它接受它作为常数。