32

restrict是 C99 的一项功能,最近通过允许编译器对指针执行“previous-fortran-only”优化而受到广泛关注。这也是微软最近宣布作为 C++AMP 规范基础的关键字。

该关键字实际上是否在 FCD 中?如果没有,是否有具体原因被省略?

4

5 回答 5

19

C++11 FDIS 中唯一提到的restrict是 §17.2 [library.c]:

许多库函数的描述依赖于 C 标准库来获取这些函数的签名和语义。在所有这些情况下,restrict应省略对限定符的任何使用。

所以restrict在 C++11 中不是这样。

于 2011-06-22T03:28:26.927 回答
15

一个论点是 Crestrict比 C++ 需要更多,因为许多操作是使用指向原始类型的指针完成的,因此 C 代码比 C++ 有更多的别名问题。

别名规则说指向不同类型的指针不能别名,所以如果函数的参数属于不同的类类型,它们就不能重叠。

在 C++ 中,我们还有valarray一系列类,它们应该处理不允许别名的基本类型数组。不是说用的太多...

添加另一种方法来解决一些混叠问题,显然并没有让委员会足够兴奋。

于 2011-06-22T15:41:00.370 回答
14

http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/

不仅 VC++ 团队,而且 ISO C++ 标准委员会也考虑分别对 VC++ 和 ISO C++ 添加限制。虽然它是专门为 ISO C++11 建议的,但它被拒绝了,部分原因是它如何扩展到 C++ 代码并不总是很明显,因为 C++ 是一种更大的语言,有更多的选项,我们希望确保该功能在整个应用程序中都能正常工作整个语言。

于 2012-05-22T18:30:47.923 回答
5

不要认为它在 C++1x 中(不幸的是,0x 的时间已经用完了......!)但至少 msvc 和 g++ 通过__restrict__restrict__扩展支持它。(我不经常使用 gcc,我认为这是正确的扩展名)。

为了与 C++正常工作,我觉得我们还需要受限引用,而不仅仅是指针,可能与我的问题C++ aliasing rules 类似。不确定其中一些考虑是否会阻碍事情......

于 2011-06-22T03:33:46.937 回答
2

我会回答“为什么不呢?”

restrict基本上只是一个编译器无法验证的断言。(或者更准确地说,当编译器可以验证它时,断言本身是没有帮助的。)这不是 C++ 委员会会喜欢的事情。C++ 一直倾向于假设“足够聪明的编译器”;哎呀,看看在编译器赶上之前最琐碎的 C++ 库的可怕性能。

我还怀疑委员会认为restrict在所有其他 C++ 功能(引用、右值引用、等等等等)存在的情况下精确定义语义将是不平凡的。

因此,指定 +“一个足够聪明的编译器不需要它”并不简单 = NAK。

于 2011-06-22T16:01:27.913 回答