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[库.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并不重要。
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 为什么使用 std::vector 的代码不能编译,但使用 std::unique_ptr 如果没有 noexcept
- C++:如果括号为空,为什么不抛出错误对象?
- 如果没有重新散列,为什么 unordered_set::begin() 会改变?
- 在C++中,如果"int a = 3; int* p = &a;",那么为什么不允许"const int* &pp = p",但允许"const int* const &pp = p"?
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 为什么不能指向指针,在没有强制转换的情况下访问结构成员?
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 如果make_shared/make_unique可以投掷bad_alloc,为什么不为它设置一个尝试捕捉块?
- 如果有条件使用String.length()的条件,为什么不一致地评估这一点
- 如果明确给出多维数组,为什么不可能char [] [] [] = {..},{..}}
- 为什么此代码编译 (C++11) 而没有类型不匹配错误
- 函数可以在C 中返回对象吗?如果是,怎么样?如果没有,为什么
- 如果没有使用使用代码的链接,则对G 中的静态常规成员的不确定引用
- 为什么不能将 int(表示 ASCII 字符)转换为 std::字符串,而没有大括号环绕在 int 周围?
- 虽然循环不检查条件,如果没有语句
- 如果操作符delete没有实现,为什么不编译它
- msvcr80.dll有真正的64位版本吗?如果没有,为什么不呢
- C++11是否添加了C99限制说明符?如果没有,为什么不呢