0

当我们有常量数据时,例如在表格中

  • double const * const或者
  • double const *

这是否为编译器提供了与 / 相同的信息__restrict是否具有相同的效果?

据我了解,__restrict基本上承诺,指向的数据不会被/通过另一个指针更改。所以,指向 const 值的指针也做出了同样的承诺,不是吗?

__restrict这里指的是 Visual Studio 中的关键字。我想在 GCC 中的含义是相似的。

4

2 回答 2

5

不,__restrict意味着有问题的指针是当前范围内唯一指向该特定数据的指针,即指针没有别名。这与 being 不同const,尽管我猜它对可修改数据更有趣。

于 2015-01-08T08:40:50.480 回答
1

指向的指针const不会告诉编译器任何事情,它会针对某些隐式转换请求警告。仅当声明对象本身const时,编译器才可能假定它保持不变(即使const被丢弃)。

__restrict另一方面,它是对编译器的一个承诺,即被引用的对象不会被当前范围内的另一个指针所别名。

我在 GCC 文档中找不到__restrict,但gcc -std=c99 -pedantic接受int *__restrict foo;int *restrict foo;作为兼容声明,表明它们具有相同的语义;暗示它与MSVC 的__restrict.

对于 C99 restrict(但不是 MSVC __restrict),当我阅读标准时,指向 -qualified 类型的restrict-qualified 指针const确实保证引用的对象不会更改(如果指针用于访问对象),请参阅。C11 (n1570) 6.7.3.1 p4。

于 2015-01-08T11:48:42.973 回答