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