【问题标题】:Does a pointer to const have the same effect as __restrict?指向 const 的指针是否与 __restrict 具有相同的效果?
【发布时间】:2015-01-08 08:39:23
【问题描述】:

当我们有恒定数据时,例如在表格中

  • double const * const
  • double const *

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

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

__restrict 这里指的是 Visual Studio 中的关键字。我猜在 GCC 中意思是相似的。

【问题讨论】:

  • __restrict,以两个下划线开头,按照惯例,是一个依赖于体系结构的特性,如果有的话,必须小心使用。不鼓励作为程序员使用它,因为它具有前缀表示它已用于某些编译器/语言/实现功能的实现,并且不得由客户端软件使用。另一方面,const 是一种标准语言功能,允许编译器检测更改常量值的尝试并警告用户值滥用。

标签: c constants restrict-qualifier


【解决方案1】:

不,__restrict 表示所讨论的指针是当前范围内唯一指向该特定数据的指针,即该指针未别名。这与const 不同,虽然我猜它对可修改数据更有趣。

【讨论】:

  • restrict 对于指向 const 的指针仍然很有趣,当它与其他指向非 const 的受限指针一起使用时,例如在memcpy().
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多