c - C99 是否允许这种冗余加载/存储优化?

标签 c optimization standards

考虑以下几点:

extern void bar(int *restrict);

void foo(int *restrict p) {
  int tmp;
  bar(&tmp);
  *p = tmp;
}

C99 规范是否允许将 foo 优化为以下内容?

extern void bar(int *restrict);

void foo(int *restrict p) {
  bar(p);
}

我在 -O3 模式下尝试了 gcc、Clang 和英特尔编译器,但都没有生成反射(reflect)上述优化的代码。这让我怀疑这种优化违反了规范。如果不允许,规范中的什么地方这样说?

注意:我的问题的灵感来自 this SO question

最佳答案

答案是否定的,这是不允许的。

考虑如果 foo 和 bar 相互递归会发生什么。例如,bar 的实现:

void bar(int *restrict p)
{
    static int q;
    if (p == &q) {
        printf("pointers match!\n");
    } else if (p == NULL) {
        foo(&q);
    }
}

bar 从不取消引用 p,因此 restrict 限定符无关紧要。很明显静态变量q不能和foo中的自动变量tmp有相同的地址。因此,foo 无法将其参数传递回 bar,并且不允许进行给定的优化。

关于c - C99 是否允许这种冗余加载/存储优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16912793/

相关文章:

c++ - C++ 中定义异常类和抛出异常的标准方法

html - 是时候切换到 HTML5 和 CSS3 了吗?

适用于范围查询条件的Oracle复合索引

mysql - 哪些 MySQL 索引需要更长时间才能更新?

c++ - 等效于 C++ 中的 python :scipy. optimize()?

用于发票的 XML - 行业标准?

c - Android Gradle 插件无法识别 SourceSet 'source'

c - 链表函数在第一个节点中打印 NULL 而不是路径

c - 缓存中的位屏蔽

c - 使用 I/O 重定向不会将多个空行压缩到一个空行中 (C)