指向const的指针是否与__restrict具有相同的效果?

时间:2015-01-08 08:39:24

标签: c const restrict-qualifier

当我们有持续数据时,例如在表格中

  • double const * const
  • double const *

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

据我了解,__restrict基本上承诺,指向的数据不会被/通过另一个指针改变。因此,指向const值的指针会产生相同的承诺,不是吗?

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

2 个答案:

答案 0 :(得分:5)

不,__restrict表示所讨论的指针是当前作用域中指向该特定数据的唯一指针,即指针不是别名。这与const不同,虽然我认为它对于可修改的数据更有趣。

答案 1 :(得分:1)

指向const的指针并不告诉编译器任何东西,它会请求某些隐式转换的警告。只有当一个对象本身被声明为const时,编译器才会认为它保持不变(即使const被抛弃)。

__restrict,另一方面,对编译器的承诺,即引用的对象不会被当前作用域中的另一个指针别名。

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

对于C99 restrict(但不是MSVC __restrict),当我阅读标准时,restrict - const - 限定类型的限定类型的指针确实承诺引用的对象没有改变(如果指针用于访问对象),参见C11(n1570)6.7.3.1 p4。