考虑以下几点:
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/