c++ - C++ 标准中“restrict”关键字/属性的情况
问题描述
简而言之,restrict
应该告诉编译器指针不能指向相同的内存位置。这对于函数参数和进一步的编译器优化非常有用。在科学计算中,restrict
应用非常广泛。
目前,restrict
关键字只是 C99 的一部分,而不是 C++ 的一部分。我们知道很多 C++ 编译器都支持__restrict__
作为扩展。这个问题还详细讨论了做什么restrict
和__restrict__
做什么。
现在,上述问题中的讨论发生在很久以前,没有谈论 C++17、C++20,也没有计划未来的标准。我发现n3988 提案讨论了 C++ 中的类似restrict
别名、C++ 中具有更丰富语法的复杂性以及潜在的补救措施。
根据 IBM 博客 (2014),鼓励 n3988 用于未来的工作。
这个问题讨论了restrict
和 C++ 的历史,没有任何关于实际实现的结论,并提到了我已经列出的论文或评论中提到的论文 (p1296)。
除了即将推出的 C++的支持计划之外,我找不到任何其他内容restrict
(据我所知,它不是 C++17 的一部分)。这似乎是一个非常有用的功能,所以我想知道
- 如果我在提案/讨论方面遗漏了什么?
- 还有其他关于
restrict
C++ 用法的信息吗? __restrict__
是否有其他方法可以通过仅使用“标准”功能使编译器优化(允许)成为可能?
解决方案
restrict
甚至在 C++20 中也没有像 C 那样的东西。已经提到的论文在 2018 年 11 月的一次初步演示中受到好评,这可能是因为它避免了限定符的关键困难——即使在 C 语言中,也没有人了解它如何与类型系统的其余部分交互。部分原因是加法restrict
不会改变任何一个指针的含义,但会影响它与其他一组指针(其成员资格未明确指定)的关系,具体取决于稍后对它们执行的算术运算。另一部分是因为 C++ 允许对类型进行如此多的操作:这std::vector<T *restrict>
意味着什么,以及索引 a 的类型是std::vector<T> &restrict
什么?
这种基于合同的方法将提供哪些实际的优化机会尚不清楚。总的来说,关于合同和优化还有许多未解决的问题。
推荐阅读
- visual-studio - 如何在我的 Visual Studio 代码片段中确定 Tab 键顺序?
- python - 为什么 jupyter 出现名称未定义
- ios - 无法构建 - expo buid:ios
- arrays - Typescript - 从联合或数组派生对象类型
- google-sheets - 数组参数 countifs 的大小不同 - Google 表格
- python - Pandas / Python - Merge dataframes where the key is located in 2 sub-strings
- javascript - 在 iOS 上一个接一个地播放视频,无需用户交互
- python-3.x - SQL 注入预防 Python 3 语法 - “.format” 替换
- python - 如何获取每周 Google Fit Rest API 数据
- c++ - for循环中的Lambda - 静态变量