Pointers 限制的无用理由
因此,我的理解是,C99标准要求指向不同类型的指针不应使用别名(即指向同一内存)。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
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
限定符?