Pointers 限制的无用理由

Pointers 限制的无用理由,pointers,c99,strict-aliasing,restrict,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); 函数 void sphere

因此,我的理解是,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
和/或
ray
包含任何
float
字段,则可以通过添加restrict受益。如果没有
restrict
,编译器必须假设
t
可能与
s
r
指向的对象中的任何
float
字段别名。因此,对
*t
的任何写入都可能会修改这样一个字段,这意味着编译器无法将所述字段的值保存在寄存器中以供以后重用,而是必须重新加载它。

即使是指向相同数据类型的指针也是
限制的。例如,请参见strcpy。事实上,
restrict
的唯一一点是告诉编译器指针是不同的,不应该使用别名。无论使用什么类型。@UnmannedPlayer编译器(如果使用
-fstrict别名编译)是否已经假定指向不同类型的指针没有别名?因此,restrict关键字只有在帮助编译器使用相同类型时才有意义。如果任何指针是指向字符数据的指针,则别名规则不适用,但
restrict
帮助编译器知道单独的指针指向单独的数据。“指向不同类型的指针没有别名”不,它更复杂,最后,没有人同意“无别名”的真正含义;除了清楚的双关语,你是在同一个位置写
int
然后读
float
。我认为这个答案应该被接受。也许还有一个后续问题:假设该函数中没有
float*t
,只有
sphere*s
ray*r
。它们都只包含浮点字段-是否仍然值得添加
restrict
限定符?