请考虑以下内容:
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);
}
我尝试了gcc、Clang和Intel编译器的-O3模式,但没有生成符合上述优化的代码,这使我怀疑此优化违反了规范。如果不允许使用该优化,请问规范在哪里明确说明了?
注:我的问题受到这个 Stack Overflow 问题的启发。
foo
得到一个指向只写内存(例如内存映射 I/O)的指针会怎样?没有优化是可以的,但有了它 -bar
可能会进行写-读-写操作。 - ugorenfoo
只对*p
进行一次写入,因此编译器无法将其优化掉。当然它不知道bar
的具体内容,因为它被声明为extern
。所以在这里,bar
可以作为一个适配器,用于在只写指针和bar
函数之间进行转换,但在这种情况下使用bar
函数可能是不安全的。 - ugoren