Visual Studio, GCC, Clang, Intel 对 C++11 特性的支持一览表 已翻译 100%

oschina 投递于 2013/03/14 19:27 (共 5 段, 翻译完成于 03-15)
阅读 17662
收藏 40
3
加载中

距离我上次对C++11支持的不同编译器的比较已经有大半年了。这次我来根据这些预览版的编译器的文档来看下它们是如何堆砌起来的。

GCC的下个版本是4.8,以及Clang即将到来的版本是3.3 。如果你使用Visual Studio 2012,你可以安装2012年11月更新支持C++11额外特征的体验版CTP。

excepiton
excepiton
翻译于 2013/03/14 20:21
1

我也对V.13.0的Intel C++编译器感到好奇,虽然它还不是预览版并且我也找不到有关它的新特性的信息。我没找到任何有关这个即将发行版本的编译器的信息。

Feature VS2012
Nov CTP
g++ 4.8 Clang 3.3 Intel 13.0
auto Yes Yes Yes Yes
decltype Yes Yes Yes Yes
Rvalue references and move semantics Yes Yes Yes Yes
Lambda expressions Yes Yes Yes Yes
nullptr Yes Yes Yes Yes
static_assert Yes Yes Yes Yes
Range based for loop Yes Yes Yes Yes
Trailing return type in functions Yes Yes Yes Yes
extern templates Yes Yes Yes Yes
>> for nested templates Yes Yes Yes Yes
Local and unnamed types as template arguments Yes Yes Yes Yes
Variadic macros Yes Yes Yes Yes
Variadic templates Yes Yes Yes Yes
Default template arguments in function templates Yes Yes Yes Yes
final method keyword Yes Yes Yes No
override method keyword Yes Yes Yes No
Strongly typed enums Yes Yes Yes Partial
Forward declared enums Yes Yes Yes Partial
Initializer lists Yes Yes Yes Partial
explicit type conversion operators Yes Yes Yes No
Raw string literals Yes Yes Yes No
Forwarding constructors Yes Yes Yes No
Template aliases No Yes Yes Yes
Defaulted methods No Yes Yes Yes
Deleted methods No Yes Yes Yes
New built-in types Partial Yes Yes Partial
Alignment support Partial Yes Yes No
Inline namespaces No Yes Yes No
sizeof on non-static data members without an instance No Yes Yes No
Changed restrictions on union members No Yes Yes No
User defined literals No Yes Yes No
Encoding support in literals No Yes Yes No
Arbitrary expressions in template deduction contexts No Yes Yes Don’t know
Non-static data member initializers No Yes Yes Don’t know
noexcept No Yes Yes Partial
constexpr No Yes Yes Partial
C99 compatibility Partial Yes Partial Yes
Generalized attributes No Yes Partial Yes
Thread local storage Partial Yes No Partial
Inheriting constructors No Yes No No
Rvalue references for *this No No Yes No
Minimal support for garbage collection Yes No No Don’t know


看起来GCC正取代Clang成为最支持C++11的编译器。Visual Studio已经增加了好几个重要C++11特性,像变参模板,初始化器和原生字。

jimmyjmh
jimmyjmh
翻译于 2013/03/14 23:10
1

我真的不能在一个更为细致的层面去评论这些编译器实现到底完成得怎样,还有没有bug。(除了VS2012——我在我的书(《C++11 Rocks》)里详细列出过VS2012最初版本的大量bug)。

看下库的支持情况也是比较有用的。由于各编译器对标准库的支持都有较多小改动,我并不打算对此给出详细的细节。我也打算在这次的比较中省略Intel的库。

我可以说,这些库的主要附件大多由第三方实现提供(随后在下面的表格中展现),尽管这是有各种各样的警告。

excepiton
excepiton
翻译于 2013/03/15 14:03
1

微软的库实现中没有那些需求尚未被实现的语言功能的东西,例如 constexpr(如VS2012的最初发行版)。库文件还没有更新,以支持2012年11月在 CTP 提出的编译器功能,如初始化列表和可变参数模板。

GCC 的 libstdc++ 也有些滞后,例如它并不支持正则表达式以及地称并发功能。同样,在很多情况下,它也没有实现 constexpr 方法。

K6F
K6F
翻译于 2013/03/15 12:06
1

Clang的libc++是100%兼容MacOS的,但是它有部分的特性还不兼容Windows和Linux。

Feature MSVC libstdc++ libc++
Concurrency: async/future/promise/packaged_task Yes Yes Yes
Concurrency: thread and related Yes Yes Yes
Concurrency: condition variables Yes Yes Yes
Concurrency: mutexes Yes Yes Yes
Concurrency: atomic types and operations Yes Yes Yes
Concurrency: relaxed memory ordering and fences Yes No Yes
Smart pointers Yes Yes Yes
Tuples Yes Yes Yes
std::bind Yes Yes Yes
std::function Yes Yes Yes
Regular expressions Yes No Yes
Type traits Yes Partial Yes
std::forward_list Yes Yes Yes
std::array Yes Yes Yes
Hash tables Yes Yes Yes
Random number generation Yes Yes Yes
Compile time rational numbers (ratio) Yes Yes Yes
Time utilities (chrono) Yes Yes Yes
Initializer lists Yes Yes Yes
Diagnostics (system_error) Yes Yes Yes
STL refinements and new algorithms Yes Yes Yes
General purpose (move, forward, declval etc.) Yes Yes Yes


比较高兴的是能看到语言和库的支持在稳步改善。Clang和GCC距离完全支持C++11已经很近了。Visual Studio同样在改善对C++11的支持,令我感到欣慰的是C++编译器的更新都是在主分支上。这份Intel的编译器特征支持列表也越来越多。

谁知道明年这4个编译器会不会全部支持C++11的特征呢!

excepiton
excepiton
翻译于 2013/03/15 11:33
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(39)

liango
liango
学习
subool
subool
c++就是不肯向java/.net那样, 搞巨型的包容万象的库, 非要摆个高架子, 要别人自己去写. java/.net越来越受人欢迎, 就是不必再去写库, 当然这些库性能末必都好.
subool
subool
没觉得c++特性太少, c语言简单吧? 但c语言已经够用了. 原以为c++这些特性都能增加语言能力, 结果当然从语言能力上看, c++这些特性的增加其实当然不够的, 不过要这么多特性做什么呢?
爽歪歪ES

引用来自“FlyZ”的评论

引用来自“爽歪歪ES”的评论

引用来自“FlyZ”的评论

引用来自“爽歪歪ES”的评论

我感觉c++除了Build和Debug需要些技巧以外,别的也木有什么难的……

其实按需求一部一部按部就班编制程序其实不难,只去学习自己需要完成的任务,为啥觉得难呢?学生来学C++,来网上一看,懂不懂就有人推荐《C++程序设计》,比砖头还重的书;然后,又有人推荐C++标准库,又是一本比砖头重的书. 这还不够,各种库接踵而来。

因此,新生代没人敢说自己会C++,语法特性多、库多。

我木觉得C++语法难,也不会有人觉得C++的语法难。更多的人觉得难的地方是,比如说Crash的Debug啊,多线程异常状况的Debug啊,项目的结构和配套的Makefile的编写是最头疼的。

多线程程序是个大难题,不论是用C++线程库还是C线程序。仅仅维护Makefile其实还好,以前我们的程序要运行在Solaris Linux FreebSD上,还引用了AutoMake AutoConfigure这一套GNU的垃圾工具,把我给害惨了。

反正我没看cmake之前,不会build任何c应用库……除了简单好build的boost,但是boost有没有现成儿的Android平台,然后就没有然后了,cmake让我现在也能入个门儿了。Build绝对是c应用的一个大坑……门槛太高了……
赵云30
赵云30

引用来自“爽歪歪ES”的评论

引用来自“FlyZ”的评论

引用来自“爽歪歪ES”的评论

我感觉c++除了Build和Debug需要些技巧以外,别的也木有什么难的……

其实按需求一部一部按部就班编制程序其实不难,只去学习自己需要完成的任务,为啥觉得难呢?学生来学C++,来网上一看,懂不懂就有人推荐《C++程序设计》,比砖头还重的书;然后,又有人推荐C++标准库,又是一本比砖头重的书. 这还不够,各种库接踵而来。

因此,新生代没人敢说自己会C++,语法特性多、库多。

我木觉得C++语法难,也不会有人觉得C++的语法难。更多的人觉得难的地方是,比如说Crash的Debug啊,多线程异常状况的Debug啊,项目的结构和配套的Makefile的编写是最头疼的。

多线程程序是个大难题,不论是用C++线程库还是C线程序。仅仅维护Makefile其实还好,以前我们的程序要运行在Solaris Linux FreebSD上,还引用了AutoMake AutoConfigure这一套GNU的垃圾工具,把我给害惨了。
爽歪歪ES

引用来自“FlyZ”的评论

引用来自“爽歪歪ES”的评论

我感觉c++除了Build和Debug需要些技巧以外,别的也木有什么难的……

其实按需求一部一部按部就班编制程序其实不难,只去学习自己需要完成的任务,为啥觉得难呢?学生来学C++,来网上一看,懂不懂就有人推荐《C++程序设计》,比砖头还重的书;然后,又有人推荐C++标准库,又是一本比砖头重的书. 这还不够,各种库接踵而来。

因此,新生代没人敢说自己会C++,语法特性多、库多。

我木觉得C++语法难,也不会有人觉得C++的语法难。更多的人觉得难的地方是,比如说Crash的Debug啊,多线程异常状况的Debug啊,项目的结构和配套的Makefile的编写是最头疼的。
赵云30
赵云30

引用来自“FQ111”的评论

编译器不作取舍,那是机器,而且它还要考虑老代码兼容。你编程序的是人,自己不会取舍呀?编码规范是摆在那占地方的?

嘿。有这个时间,我python ruby什么的全学会了,而且能拿上万的工资了....
赵云30
赵云30

引用来自“七液”的评论

引用来自“karlcoder”的评论

还是那句话:整日用C++的人,觉得 C++特性太少了;几乎不用 C++ 的人,倒抱怨 C++ 特性太多了。

呵呵~我觉得您说的是C++库太少而不是语言特性太少吧?基本上Java,C#,C的特性C++几乎都有了这还少?大部分公司都是裁剪后才使用的。特性多不见得就是好东西。只会让人更迷茫。

库和语言本身都太多。抱怨少?第一次听说,其实不是抱怨少,而是抱怨现有的一坨东西不能简洁漂亮完成自己工作任务,这是对C++的最有利的控诉啊。
赵云30
赵云30

引用来自“Lunar_Lin”的评论

得, 要是java的更新 就一大堆人期待了. 上面有几位是搞c++的, 没学过C++, C++当然对你是天书.
C++很多特性是给库开发用的 以及增强模板; 模板这东西, 你要认为是天书, 那lisp那些东西不也一样是天书么?
C++ 0x11 个人还是非常支持的. 让c++ 代码 更简单, 更高效.

这个到底有啥特性?这篇文章又看到一些没见过的东西。就不会删一些东西吗。
赵云30
赵云30

引用来自“BillyJack”的评论

C++越来越庞大,复杂,感觉发展方向不对,应该逐渐删掉不常用的语言特征,同时吸取java,C#的长处,增加大量的库,引导码农走出语言细节的泥潭,去实践对象方法论(设计模式),快速成长为擅长宏观思考、把握全局的设计师、架构师

你说的有道理,不过似乎C++标准委员会只会往里加东西,不会扔掉一些“包袱”;全盘继承C就是一个很好的先例。所以,还在C++上受苦的兄弟们,有机会投入C# Java的怀抱吧,同时祈祷C#和Java不要走上C++的老路。

我就不说投入Python RUby的怀抱了,毕竟这辆东西是大不起来的。 -_-
返回顶部
顶部