首页 > 解决方案 > 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 的一部分)。这似乎是一个非常有用的功能,所以我想知道

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

解决方案


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

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


推荐阅读