C99中的restrict关键字详解

1 restrict 介绍

        restrict是一个用于限定指针的关键字,一般定义int * restrict a,用来告知编译器,对于该指针指向的内容的修改,只能通过该指针实现,这样做的一个好处是,可以让编译器来更好的优化代码,生成效率更高的汇编代码。gcc编译时需要 加-std=c99 来实现对c99的支持。

2 举例说明


int func (int* a, int* b)
{
        *a = 2;
        *b = 3;
        return *a;
}

如果在 a 和 b指向内存空间不同时,可以保证返回值一定是2,如果指向的内存空间一致时,返回值为3。虽然,对于一般常规的定义a 和 b不会指向相同的内存空间,但是也会有误操作的可能。那么对于这样一个函数的返回值绝大概率返回值为2,极小概率返回值为3。然而对于编译器来说只有生成100%正确的代码才会进行优化。因此编译器不会替换成下面的更优版本:

int func (int* a, int* b)
{
        *a = 2;
        *b = 3;
        return 2;
}

如果使用restrict这个关键字,就可以利用它来帮助编译器安全的进行代码优化:
int func (int *restrict a, int *restrict b)
{
        *a = 2;
        *b = 3;
        return *a;
}

此刻,由于restrict的效果,指针a 是*a 修改的唯一途径,*b不会对*a的内容修改,因此可以安全的优化为下列代码:

int func (int *restrict a, int *restrict b)
{
        *a = 2;
        *b = 3;
        return 2;
}
 

你可能感兴趣的:(C++精进之路,算法,开发语言,c语言,c++)