虽然有很多例子[1] [2] [3]说明了restrict
关键字是如何工作的,但我不完全确定受限关系在它可以指向的指针上是否具有传递性。例如,以下代码声明了一个包含整数和指向整数的指针的结构。
typedef struct container_s {
int x;
int *i;
} container_s;
int bar(container_s *c, int *i) {
int* tmp = c->i;
*tmp = 5;
*i = 4;
return *tmp;
}
int main(){
return 0;
}
编译器是否需要额外的load
指令来最后访问tmp
(返回值),因为它无法推断*i
并且*tmp
没有别名?
如果是这样,这个新定义会解决这个负载吗?
int bar(container_s *c, int* restrict i) { ... }
编辑
当我生成 LLVM IR ( )时,这种情况int bar(container_s *c, int * restrict i) { ... }
会消除提取负载。clang -S -O3 -emit-llvm
但是,我不明白为什么接下来的两个修改在以下情况下不会删除最终负载:
我将函数的定义(是否
restrict
考虑过传递c->i
?)更新为:int bar(container_s * restrict c, int *i) { ... }
我更新结构如下(为什么编译器不能推断不需要额外的负载?):
typedef struct container_s { int x; int * restrict i; } container_s; int bar(container_s *c, int *i) { ... }