restrict

← C语言知识地图


核心:告诉编译器,该指针是访问其所指内存的唯一途径。

语法

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。
  • 可用于函数参数或局部指针变量,不能用于全局指针。