限制资格
如果我们有两个相同类型的指针参数,编译器不能做任何假设,并且总是必须假设对*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?
这可以证明是低效的,如果我们知道通过一些外部的信息 e
和 f
永远指向同一个数据对象。我们可以通过在指针参数中添加 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);
}
然后编译器可能总是假设 e
和 f
指向不同的对象。