当我们有持续数据时,例如在表格中
double const * const
或double const *
这是否为编译器提供了与__restrict
相同的信息/它是否具有相同的效果?
据我了解,__restrict
基本上承诺,指向的数据不会被/通过另一个指针改变。因此,指向const值的指针会产生相同的承诺,不是吗?
__restrict
这里指的是Visual Studio中的关键字。我猜GCC的含义相似。
答案 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。