restrict
是 C99 的一项功能,最近通过允许编译器对指针执行“previous-fortran-only”优化而受到广泛关注。这也是微软最近宣布作为 C++AMP 规范基础的关键字。
该关键字实际上是否在 FCD 中?如果没有,是否有具体原因被省略?
C++11 FDIS 中唯一提到的restrict
是 §17.2 [library.c]:
许多库函数的描述依赖于 C 标准库来获取这些函数的签名和语义。在所有这些情况下,
restrict
应省略对限定符的任何使用。
所以restrict
在 C++11 中不是这样。
一个论点是 Crestrict
比 C++ 需要更多,因为许多操作是使用指向原始类型的指针完成的,因此 C 代码比 C++ 有更多的别名问题。
别名规则说指向不同类型的指针不能别名,所以如果函数的参数属于不同的类类型,它们就不能重叠。
在 C++ 中,我们还有valarray
一系列类,它们应该处理不允许别名的基本类型数组。不是说用的太多...
添加另一种方法来解决一些混叠问题,显然并没有让委员会足够兴奋。
http://herbsutter.com/2012/05/03/reader-qa-what-about-vc-and-c99/
不仅 VC++ 团队,而且 ISO C++ 标准委员会也考虑分别对 VC++ 和 ISO C++ 添加限制。虽然它是专门为 ISO C++11 建议的,但它被拒绝了,部分原因是它如何扩展到 C++ 代码并不总是很明显,因为 C++ 是一种更大的语言,有更多的选项,我们希望确保该功能在整个应用程序中都能正常工作整个语言。
不要认为它在 C++1x 中(不幸的是,0x 的时间已经用完了......!)但至少 msvc 和 g++ 通过__restrict
和__restrict__
扩展支持它。(我不经常使用 gcc,我认为这是正确的扩展名)。
为了与 C++正常工作,我觉得我们还需要受限引用,而不仅仅是指针,可能与我的问题C++ aliasing rules 类似。不确定其中一些考虑是否会阻碍事情......
我会回答“为什么不呢?”
restrict
基本上只是一个编译器无法验证的断言。(或者更准确地说,当编译器可以验证它时,断言本身是没有帮助的。)这不是 C++ 委员会会喜欢的事情。C++ 一直倾向于假设“足够聪明的编译器”;哎呀,看看在编译器赶上之前最琐碎的 C++ 库的可怕性能。
我还怀疑委员会认为restrict
在所有其他 C++ 功能(引用、右值引用、等等等等)存在的情况下精确定义语义将是不平凡的。
因此,指定 +“一个足够聪明的编译器不需要它”并不简单 = NAK。