在KlayGE首次引入C++11特性之后,我顺便调研了一下个主流编译器对C++11的支持度,以便在下个版本中加入更多的C++11元素。这里还列出了在不支持的时候,可以采用的替代方案。主要参考了C++11 Features in Visual C++ 11,Status of Experimental C++0x Support in GCC 4.6,Status of Experimental C++0x Support in GCC 4.7,Boost。
C++11 Core Language Features
| |
VC 10 |
VC 11 |
GCC 4.6 |
GCC 4.7 |
替代方案 |
| Rvalue references |
Yes |
Yes |
Yes |
Yes |
Boost.Move |
| Rvalue references for *this |
No |
No |
No |
No |
|
| Non-static data member initializers |
No |
No |
No |
Yes |
|
| Variadic templates |
No |
No |
Yes |
Yes |
|
| Initializer lists |
No |
No |
Yes |
Yes |
|
| static_assert |
Yes |
Yes |
Yes |
Yes |
Boost.Static Assert |
| auto |
Yes |
Yes |
Yes |
Yes |
Boost.Typeof |
| Trailing return types |
Yes |
Yes |
Yes |
Yes |
Boost.ReturnType |
| Lambdas |
Yes |
Yes |
Yes |
Yes |
Boost.Lambda |
| decltype |
Yes |
Yes |
Yes |
Yes |
Boost.Typeof |
| Right angle brackets |
Yes |
Yes |
Yes |
Yes |
TR1 |
| Default template arguments for function templates |
No |
No |
Yes |
Yes |
|
| Expression SFINAE |
No |
No |
Yes |
Yes |
|
| Alias templates |
No |
No |
No |
Yes |
|
| Extern templates |
Yes |
Yes |
Yes |
Yes |
|
| nullptr |
Yes |
Yes |
Yes |
Yes |
自己实现的null_ptr |
| Strongly typed enums |
No |
Yes |
Yes |
Yes |
#define |
| Forward declared enums |
No |
Yes |
Yes |
Yes |
|
| Attributes |
No |
No |
No |
No |
|
| constexpr |
No |
No |
Yes |
Yes |
|
| Alignment |
No |
No |
No |
No |
|
| Delegating constructors |
No |
No |
No |
Yes |
|
| Inheriting constructors |
No |
No |
No |
No |
|
| Explicit conversion operators |
No |
No |
Yes |
Yes |
|
| char16_t and char32_t |
No |
No |
Yes |
Yes |
|
| Unicode string literals |
No |
No |
Yes |
Yes |
|
| Raw string literals |
No |
No |
Yes |
Yes |
|
| Universal character names in literals |
No |
No |
Yes |
Yes |
|
| User-defined literals |
No |
No |
No |
Yes |
|
| Standard-layout and trivial types |
No |
Yes |
Yes |
Yes |
|
| Defaulted and deleted functions |
No |
No |
Yes |
Yes |
|
| Extended friend declarations |
Yes |
Yes |
No |
Yes |
|
| Extended sizeof |
No |
No |
No |
Yes |
|
| Inline namespaces |
No |
No |
Yes |
Yes |
|
| Unrestricted unions |
No |
No |
Yes |
Yes |
|
| Local and unnamed types as template arguments |
Yes |
Yes |
Yes |
Yes |
|
| Range-based for-loop |
No |
Yes |
Yes |
Yes |
Boost.Foreach |
| override and final |
No |
Yes |
No |
Yes |
#define |
| Minimal GC support |
Yes |
Yes |
No |
No |
|
| noexcept |
No |
No |
Yes |
Yes |
|
C++11 Core Language Features: Concurrency
| |
VC 10 |
VC 11 |
GCC 4.6 |
GCC 4.7 |
替代方案 |
| Reworded sequence points |
No |
No |
No |
No |
|
| Atomics |
No |
Yes |
No |
Yes |
Boost.Atomic |
| Strong compare and exchange |
No |
Yes |
No |
No |
|
| Bidirectional fences |
No |
Yes |
No |
No |
|
| Memory model |
No |
No |
No |
No |
|
| Data-dependency ordering |
No |
Yes |
No |
No |
|
| Data-dependency ordering: function annotation |
No |
No |
No |
No |
|
| exception_ptr |
Yes |
Yes |
Yes |
Yes |
Boost.Exception |
| quick_exit and at_quick_exit |
No |
No |
No |
No |
|
| Atomics in signal handlers |
No |
No |
No |
No |
|
| Thread-local storage |
No |
No |
No |
No |
Boost.Thread |
| Magic statics |
No |
No |
No |
No |
|
C++11 Core Language Features: C99
| |
VC 10 |
VC 11 |
GCC 4.6 |
GCC 4.7 |
替代方案 |
| __func__ |
No |
No |
Yes |
Yes |
__FUNCTION__ |
| C99 preprocessor |
No |
No |
Yes |
Yes |
|
| long long |
Yes |
Yes |
Yes |
Yes |
__int64 |
| Extended integer types |
No |
No |
No |
No |
|
C++11 Library
| |
VC 10 |
VC 11 |
GCC 4.6 |
GCC 4.7 |
替代方案 |
| shared_ptr, weak_ptr |
Yes |
Yes |
Yes |
Yes |
Boost.SmartPtr |
| make_/allocate_shared, owner_before |
Yes |
Yes |
Yes |
Yes |
Boost.SmartPtr |
| unique_ptr |
Yes |
Yes |
Yes |
Yes |
Boost.Interprocess |
| Fixed-Size Arrays |
Yes |
Yes |
Yes |
Yes |
Boost.Arrays |
| Hash Tables |
Yes |
Yes |
Yes |
Yes |
Boost.Unordered |
| Singly-linked list |
Yes |
Yes |
Yes |
Yes |
Boost.Container |
| Regular Expressions |
Yes |
Yes |
Yes |
Yes |
Boost.Regex |
| Tuple |
Yes |
Yes |
Yes |
Yes |
Boost.Tuple |
| Random Numbers & Distributions |
Yes |
Yes |
Yes |
Yes |
Boost.Random |
| Type Traits |
Yes |
Yes |
Yes |
Yes |
Boost.TypeTraits |
| Generalized Function Pointers |
Yes |
Yes |
Yes |
Yes |
Boost.Function |
| Generalized Binders |
Yes |
Yes |
Yes |
Yes |
Boost.Bind |
| Generalized Member Function Adapters |
Yes |
Yes |
Yes |
Yes |
Boost.Bind |
| Reference Wrappers |
Yes |
Yes |
Yes |
Yes |
Boost.Ref |
| Return type calculation |
Yes |
Yes |
Yes |
Yes |
Boost.ReturnType |
| New algorithms |
Yes |
Yes |
Yes |
Yes |
Boost.Algorithm |
| Time |
No |
No |
Yes |
Yes |
Boost.Chrono |
其中,斜体的Yes表示VC 11和GCC 4.7都支持,同时还有非C++11的替代方案,所以很可能在下一版本的KlayGE中使用到。从上面的表可以看出,Library的支持度相当好。即使编译器不支持,也可以很容易地用Boost替换掉。语言核心则还远不到完美,但最常用的基本都已经涵盖了。有些feature,比如foreach和auto,用Boost在库级别支持,对编译速度有很大影响。换用C++11在核心语言级别支持的话应该有较大幅度的编译性能提升。
Comments