restrict是c99标准引入的,它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针(野指针)。这个关键字只能在C99标准的C程序里使用,C++程序不支持,restrict的起源最早可以追溯到Fortran。
下面通过一段小代码来理解一下。
//
// main.c
// restrict
//
// Created by ChengChao on 14-9-27.
// Copyright (c) 2014年 cc. All rights reserved.
//
#include <stdio.h>
int main(int argc, const char * argv[]) {
int arr[10];
//arr和par都可以访问arr指向的这块内存区域
int* par = arr;
//使用了restrict操作符,意思是只有restar指针可以访问其指向的这块内存,其他指针再指向这块内存时也无法访问
int* restrict restar = (int *)malloc(10 * sizeof(int));
for (int n = 0; n < 10; n++) {
//多个指针都修改了arr
par[n] += 5;
arr[n] *= 2;
par[n] += 3;
//编译器确定只有一个指针修改改内存,就会将下面两行代码优化为 restar[n] += 8
//这里可以看一下汇编代码,确实进行了此优化操作
restar[n] += 5;
restar[n] += 3;
}
free(restar);
return 0;
}