限制资格

如果我们有两个相同类型的指针参数,编译器不能做任何假设,并且总是必须假设对*e 的更改可能会改变*f

void fun(float* e, float* f) {
    float a = *f
    *e = 22;
    float b = *f;
    print("is %g equal to %g?\n", a, b);
}

float fval = 4;
float eval = 77;
 fun(&eval, &fval);

一切顺利,等等

是 4 等于 4?

打印出来。如果我们传递相同的指针,程序仍然会做正确的事情并打印

是 4 等于 22?

这可以证明是低效的,如果我们知道通过一些外部的信息 ef 永远指向同一个数据对象。我们可以通过在指针参数中添加 restrict 限定符来反映这些知识:

void fan(float*restrict e, float*restrict f) {
    float a = *f
    *e = 22;
    float b = *f;
    print("is %g equal to %g?\n", a, b);
}

然后编译器可能总是假设 ef 指向不同的对象。