C语言数据存储与指针
1.C语言restrict 得作用
在 C 语言中,restrict
是 C99 标准引入的一个 类型限定符(type qualifier),用于指针,表示该指针是访问其所指向对象的 唯一方式。
restrict
的基本作用:
告诉编译器:
“在当前作用域中,通过这个
restrict
指针访问的内存,不会被其他指针访问。”
这样,编译器可以放心地进行优化,比如更激进地重排指令、消除冗余加载等。
void add(int * restrict a, int * restrict b, int * restrict c, int n) {for (int i = 0; i < n; ++i)c[i] = a[i] + b[i];
}
上面函数表示:
a[i]
、b[i]
、c[i]
指向的内存 不重叠。编译器可以假设:修改
a[i]
不会影响b[i]
或c[i]
,从而生成更高效的代码。
若违反 restrict
的承诺:
违反 restrict
的前提会导致 未定义行为(undefined behavior)。
例如:
void f(int * restrict a, int * restrict b) {a[0] = 1;b[0] = 2;
}int x;
f(&x, &x); //UB:a 和 b 指向同一个对象
restrict
是一种承诺:“只有我会访问这块内存”,它能让编译器大胆优化,但你必须自己保证不违反这个承诺。