【发布时间】:2017-08-29 22:33:50
【问题描述】:
所以我的理解是,C99 标准要求指向不同类型的指针不应使用别名(即指向相同的内存)。 restrict 关键字向编译器保证两个特定变量(相同类型?)不在同一个内存槽中。
因此,以下函数不会从restrict 关键字中受益,这是真的吗?
void sphere_intersect(float* t, const sphere* s, const ray* r);
但是,这样的函数会:
void vector_add(vector* v, const vector* u);
【问题讨论】:
-
即使指向相同数据类型的指针也是
restricted。例如,参见 strcpy。 -
其实
restrict的唯一意义就是告诉编译器指针不同,不应该有别名。使用什么类型无关紧要。 -
@UnmannedPlayer 不是编译器已经假设(如果您使用
-fstrict-aliasing编译)指向不同类型的指针没有别名?因此,restrict 关键字只有在帮助编译器具有相同类型时才有意义。 -
如果任何指针是指向字符数据的指针,则别名规则不适用,但
restrict帮助编译器知道单独的指针指向单独的数据。 -
"指向不同类型的指针没有别名" 不,它更复杂,最后,没有人同意“无别名”的真正含义;除了在明确的双关语中,您是否写了
int,然后在同一位置读了float。
标签: pointers c99 strict-aliasing restrict