[英]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.