首页 > 代码库 > C/C++ restrict修饰符

C/C++ restrict修饰符

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;
}


C/C++ restrict修饰符