首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC:__atomic_always_lock_free用-O3编译,而不是用-O0编译

GCC:__atomic_always_lock_free用-O3编译,而不是用-O0编译
EN

Stack Overflow用户
提问于 2022-04-09 15:03:08
回答 1查看 63关注 0票数 0

样本代码:

代码语言:javascript
复制
int *s;

int foo(void)
{
  return 4;
}

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

请求:

代码语言:javascript
复制
$ 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.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-09 15:34:56

这似乎并不奇怪。您所链接的文档指出,"size必须解析为编译时常量“,因此在传递foo()时可能会出现错误。然而,典型的情况是,如果GCC能够在编译时确定表达式的值,那么它就会将其视为编译时常数,即使它不符合语言对常量表达式的基本定义。这可以被认为是一个扩展,并且在6.6p10被C17标准显式地允许。

优化级别与编译器在试图在编译时计算表达式时所尝试的内容有关。在关闭优化之后,它所做的仅仅是标准所需的基本常量折叠(例如2*4)。通过优化,您可以获得它的全部常量传播传递以及函数内联的好处。

因此,本质上,在-O0下,编译器没有注意到foo()总是返回相同的值,因为您已经禁用了允许它得出这个结论的优化。对于-O3,它是这样做的,因此它接受它作为一个常量。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71809210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档