繁体   English   中英

C ++ 11是否添加了C99限制说明符? 如果没有,为什么不呢?

[英]Does C++11 add the C99 restrict specifier? If not, why not?

restrict是一个C99功能,它最近得到了很多关注,允许编译器对指针执行“以前只能进行Fortran”优化。 这也是微软最近公布的相同关键词,它是C ++ AMP规范的基础。

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

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

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

所以restrict不在C ++ 11中。

一个论点是C需要比C ++更多的restrict ,因为许多操作是使用指向原始类型的指针完成的,因此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 ++别名规则一致 不确定这些考虑因素是否可能会阻碍......

我会抓住“为什么不呢?”

restrict基本上只是编译器无法验证的断言。 (或者更准确地说,当编译器可以验证它时,断言本身没有帮助。)这不是C ++委员会喜欢的那种东西。 C ++总是倾向于假设“足够聪明的编译器”; 哎呀,看看编译器赶上之前最琐碎的C ++库的糟糕表现。

我还怀疑委员会认为,在存在所有其他C ++特性(引用,右值引用,等等等等)的情况下定义restrict语义将是非平凡的。

因此,指定+“足够智能的编译器并不需要它”非常重要= NAK。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM