无用的限制案例

时间:2017-08-29 22:33:51

标签: pointers c99 strict-aliasing restrict

所以我的理解是C99标准要求指向不同类型的指针不应该别名(即指向相同的内存)。 restrict关键字确保编译器两个特定变量(相同类型?)不在同一个内存插槽中。

因此,以下函数不会从restrict关键字中获利吗?

void sphere_intersect(float* t, const sphere* s, const ray* r); 

但是,像这样的函数会:

void vector_add(vector* v, const vector* u);

1 个答案:

答案 0 :(得分:1)

这样的功能
void sphere_intersect(float* t, const sphere* s, const ray* r);
如果类型sphere和/或ray包含任何float字段,则

可以从添加限制中受益。如果缺少restrict,则编译器必须假定t可能与floats指向的对象中的任何r字段别名。因此,对*t的任何写入都可能会修改这样的字段,这意味着编译器无法在寄存器中保存所述字段的值以供以后重用,而是必须重新加载它。