【问题标题】:Useless case for restrict限制的无用案例
【发布时间】: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


【解决方案1】:

类似的函数

void sphere_intersect(float* t, const sphere* s, const ray* r);

如果类型 sphere 和/或 ray 包含任何 float 字段,则可以从添加限制中受益。如果没有restrict,编译器必须假定t 可能与sr 指向的对象中的任何float 字段产生别名。因此,对*t 的任何写入都可能会修改这样的字段,这意味着编译器无法将所述字段的值保存在寄存器中以供以后重用,而是必须重新加载它。

【讨论】:

  • 我认为这个答案是应该被接受的。不过,也许是一个后续问题:假设该函数中没有float* t,只有sphere* sray* r。它们都只包含浮点字段 - 请问是否仍然值得添加 restrict 限定符?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
相关资源
最近更新 更多