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; }
原文地址:http://blog.csdn.net/oktears/article/details/39611435