restrict
核心:告诉编译器,该指针是访问其所指内存的唯一途径。
语法
int *restrict p;restrict 是 C99 引入的类型限定符,仅用于修饰指针。
作用
1. 允许编译器做更激进的优化
编译器默认必须假设多个指针可能指向同一块内存(别名问题),因此不敢随意重排或省略访存指令。
加上 restrict 后,程序员向编译器承诺:这段作用域内,只有这个指针(及其直接派生指针)会访问该内存。编译器据此可以做 SIMD 向量化、指令重排、减少重复加载等优化。
void add(int *restrict a, int *restrict b, int *restrict c, int n) {
for (int i = 0; i < n; i++)
a[i] = b[i] + c[i]; // 编译器可放心向量化,无需担 a 与 b/c 重叠
}2. 提升代码可维护性
restrict 是程序员对编译器(也对后来的阅读者)的一份契约声明:这几个指针互不重叠。违反契约 = 未定义行为。
常见场景
| 标准库函数 | 说明 |
|---|---|
memcpy(dst, src, n) | restrict 限定,dst/src 不可重叠 |
memmove(dst, src, n) | 无 restrict,允许重叠 |
void *memcpy(void *restrict, const void *restrict, size_t) | — |
注意事项
- 程序员负责保证:编译器不检查别名是否真的不存在,违反承诺导致 UB。
- 只约束指针本身:
restrict不改变指向对象的类型,也不影响 const/volatile。 - 可用于函数参数或局部指针变量,不能用于全局指针。