from : https://blog.csdn.net/lovekatherine/article/details/1891806

今天读APUE,看到某个函数原型的声明:

int stat(const char * restrict  pathname,struct stat * restrict buf);

这里的restrict让我觉得有些疑惑,一查原来是C99中增加的关键字

那么restrict的意义是什么呢:

One of the new features in the recently approved C standard C99, is the

restrict

pointer qualifier. This qualifier can be applied to a data pointer to indicate that, during the scope of that pointer declaration, all data accessed through it will be accessed only through that pointer but not through any other pointer. The 'restrict' keyword thus enables the compiler to perform certain optimizations based on the premise that a given object cannot be changed through another pointer. Now you're probably asking yourself, "doesn't const already guarantee that?" No, it doesn't. The qualifier const ensures that a variable cannot be changed through a

particular

pointer. However, it's still possible to change the variable through a different pointer.

编者进行了google直译:

最近批准的C标准C99中的新功能之一是限制指针限定符。 该限定符可以应用于数据指针,以指示在该指针声明的范围内,通过它访问的所有数据只能通过该指针访问,而不能通过任何其他指针访问。 'restrict'关键字因此使得编译器能够基于不能通过另一个指针改变给定对象的前提来执行某些优化。 现在你可能会问自己,“不会保证吗?” 不,它没有。 限定符const确保变量不能通过特定的指针进行更改。 但是,仍然可以通过不同的指针来更改变量。

概括的说,关键字restrict只用于限定指针;该关键字用于告知编译器,所有修改该指针所指向内容的操作全部都是基于(base on)该指针的,即不存在其它进行修改操作的途径;这样的后果是帮助编译器进行更好的代码优化,生成更有效率的汇编代码。

举个简单的例子:

int foo (int* x, int* y)
{
    *x = 0;
    *y = 1;
    return *x;
}

很显然函数foo()的返回值是0,除非参数x和y的值相同。可以想象,99%的情况下该函数都会返回0而不是1。然而编译起必须保证生成100%正确的代码,因此,编译器不能将原有代码替换成下面的更优版本

int f (int* x, int* y)
{
    *x = 0;
    *y = 1;
    return 0;
}

啊哈,现在我们有了restrict这个关键字,就可以利用它来帮助编译器安全的进行代码优化了

int f (int *restrict x, int *restrict y)
{
    *x = 0;
    *y = 1;
    return *x;
}

此时,由于指针 x 是修改 *x的唯一途径,编译起可以确认 “*y=1; ”这行代码不会修改 *x的内容,因此可以安全的优化为

int f (int *restrict x, int *restrict y)
{
    *x = 0;
    *y = 1;
    return 0;
}

最后注意一点,restrict是C99中定义的关键字,C++目前并未引入;在GCC可通过使用参数" -std=c99"

results matching ""

    No results matching ""