gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:40:31 25 4
gpt4 key购买 nike

考虑以下几点:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com