【问题标题】:Situation with `restrict` keyword/attribute in C++ standardC++ 标准中“restrict”关键字/属性的情况
【发布时间】:2019-05-23 21:48:44
【问题描述】:

简而言之,restrict 应该告诉编译器指针不能指向相同的内存位置。这对于函数参数和进一步的编译器优化非常有用。在科学计算中,restrict 的使用非常广泛。

目前,restrict 关键字只是 C99 的一部分,而不是 C++ 的一部分。我们know that a lot of C++ compilers support __restrict__ as an extension. This question 还详细讨论了restrict__restrict__ 的作用。

现在,上述问题中的讨论发生在很久以前,没有谈论 C++17、C++20,也没有计划未来的标准。我发现 n3988 proposal 讨论了 C++ 中类似于 restrict 的别名、C++ 中具有更丰富语法的复杂性以及潜在的补救措施。

根据 IBM 博客 (2014),n3988 was encouraged for future work

This question 谈论了restrict 和 C++ 的历史,但没有任何关于实际实现的结论,并提到了我已经列出的论文或the one mentioned in the comments (p1296)

除了在即将推出的 C++ 中支持 restrict 的计划之外,我找不到任何其他内容(据我所知,它不是 C++17 的一部分)。这似乎是一个非常有用的功能,所以我想知道

  • 如果我在提案/讨论方面遗漏了什么?
  • 还有其他关于 C++ 中 restrict 用法的信息吗?
  • 是否有其他方法可以通过仅使用“标准”功能来实现编译器优化(__restrict__ 允许)?

【问题讨论】:

标签: c++ standards c++20 restrict-qualifier


【解决方案1】:

在 C++20 中也没有像 C 的 restrict 这样的东西。 paper already mentioned 在 2018 年 11 月的初步演示中受到好评,可能是因为它避免了限定符的关键困难——即使在 C 语言中,也没有人了解它如何与类型系统的其余部分交互。部分原因是添加 restrict 不会改变任何一个指针的含义,但会影响它与其他一些指针(其成员资格未明确指定)的关系,具体取决于稍后对其执行的算术运算。另一部分是因为 C++ 允许对类型进行如此多的操作:std::vector<T *restrict> 是什么意思,std::vector<T> &restrict 的索引类型是什么?

这种基于合同的方法将提供哪些实际的优化机会尚不清楚;总的来说,关于合约和优化还有许多未解决的问题。

【讨论】:

    猜你喜欢
    • 2010-10-21
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2016-09-29
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多