所以我的理解是C99标准要求指向不同类型的指针不应该别名(即指向相同的内存)。 restrict
关键字确保编译器两个特定变量(相同类型?)不在同一个内存插槽中。
因此,以下函数不会从restrict
关键字中获利吗?
void sphere_intersect(float* t, const sphere* s, const ray* r);
但是,像这样的函数会:
void vector_add(vector* v, const vector* u);
答案 0 :(得分:1)
像
这样的功能void sphere_intersect(float* t, const sphere* s, const ray* r);
如果类型sphere
和/或ray
包含任何float
字段,则可以从添加限制中受益。如果缺少restrict
,则编译器必须假定t
可能与float
或s
指向的对象中的任何r
字段别名。因此,对*t
的任何写入都可能会修改这样的字段,这意味着编译器无法在寄存器中保存所述字段的值以供以后重用,而是必须重新加载它。