当我们有常量数据时,例如在表格中
double const * const
或者double const *
这是否为编译器提供了与 / 相同的信息__restrict
是否具有相同的效果?
据我了解,__restrict
基本上承诺,指向的数据不会被/通过另一个指针更改。所以,指向 const 值的指针也做出了同样的承诺,不是吗?
__restrict
这里指的是 Visual Studio 中的关键字。我想在 GCC 中的含义是相似的。
当我们有常量数据时,例如在表格中
double const * const
或者double const *
这是否为编译器提供了与 / 相同的信息__restrict
是否具有相同的效果?
据我了解,__restrict
基本上承诺,指向的数据不会被/通过另一个指针更改。所以,指向 const 值的指针也做出了同样的承诺,不是吗?
__restrict
这里指的是 Visual Studio 中的关键字。我想在 GCC 中的含义是相似的。
不,__restrict
意味着有问题的指针是当前范围内唯一指向该特定数据的指针,即指针没有别名。这与 being 不同const
,尽管我猜它对可修改数据更有趣。
指向的指针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。