各编译器对C++11的支持比较

来源:互联网 发布:五十而知天命什么意思 编辑:程序博客网 时间:2024/05/21 08:55
转载自KlayGE游戏引擎,本文的永久链接为http://www.klayge.org/?p=2154

在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 10VC 11GCC 4.6GCC 4.7替代方案Rvalue referencesYesYesYesYesBoost.MoveRvalue references for *thisNoNoNoNo Non-static data member initializersNoNoNoYes Variadic templatesNoNoYesYes Initializer listsNoNoYesYes static_assertYesYesYesYesBoost.Static AssertautoYesYesYesYesBoost.TypeofTrailing return typesYesYesYesYesBoost.ReturnTypeLambdasYesYesYesYesBoost.LambdadecltypeYesYesYesYesBoost.TypeofRight angle bracketsYesYesYesYesTR1Default template arguments for function templatesNoNoYesYes Expression SFINAENoNoYesYes Alias templatesNoNoNoYes Extern templatesYesYesYesYes nullptrYesYesYesYes自己实现的null_ptrStrongly typed enumsNoYesYesYes#defineForward declared enumsNoYesYesYes AttributesNoNoNoNo constexprNoNoYesYes AlignmentNoNoNoNo Delegating constructorsNoNoNoYes Inheriting constructorsNoNoNoNo Explicit conversion operatorsNoNoYesYes char16_t and char32_tNoNoYesYes Unicode string literalsNoNoYesYes Raw string literalsNoNoYesYes Universal character names in literalsNoNoYesYes User-defined literalsNoNoNoYes Standard-layout and trivial typesNoYesYesYes Defaulted and deleted functionsNoNoYesYes Extended friend declarationsYesYesNoYes Extended sizeofNoNoNoYes Inline namespacesNoNoYesYes Unrestricted unionsNoNoYesYes Local and unnamed types as template argumentsYesYesYesYes Range-based for-loopNoYesYesYesBoost.Foreachoverride and finalNoYesNoYes#defineMinimal GC supportYesYesNoNo noexceptNoNoYesYes 

C++11 Core Language Features: Concurrency

 VC 10VC 11GCC 4.6GCC 4.7替代方案Reworded sequence pointsNoNoNoNo AtomicsNoYesNoYesBoost.AtomicStrong compare and exchangeNoYesNoNo Bidirectional fencesNoYesNoNo Memory modelNoNoNoNo Data-dependency orderingNoYesNoNo Data-dependency ordering: function annotationNoNoNoNo exception_ptrYesYesYesYesBoost.Exceptionquick_exit and at_quick_exitNoNoNoNo Atomics in signal handlersNoNoNoNo Thread-local storageNoNoNoNoBoost.ThreadMagic staticsNoNoNoNo 

C++11 Core Language Features: C99

 VC 10VC 11GCC 4.6GCC 4.7替代方案__func__NoNoYesYes__FUNCTION__C99 preprocessorNoNoYesYes long longYesYesYesYes__int64Extended integer typesNoNoNoNo 

C++11 Library

 VC 10VC 11GCC 4.6GCC 4.7替代方案shared_ptr, weak_ptrYesYesYesYesBoost.SmartPtrmake_/allocate_shared, owner_beforeYesYesYesYesBoost.SmartPtrunique_ptrYesYesYesYesBoost.InterprocessFixed-Size ArraysYesYesYesYesBoost.ArraysHash TablesYesYesYesYesBoost.UnorderedSingly-linked listYesYesYesYesBoost.ContainerRegular ExpressionsYesYesYesYesBoost.RegexTupleYesYesYesYesBoost.TupleRandom Numbers & DistributionsYesYesYesYesBoost.RandomType TraitsYesYesYesYesBoost.TypeTraitsGeneralized Function PointersYesYesYesYesBoost.FunctionGeneralized BindersYesYesYesYesBoost.BindGeneralized Member Function AdaptersYesYesYesYesBoost.BindReference WrappersYesYesYesYesBoost.RefReturn type calculationYesYesYesYesBoost.ReturnTypeNew algorithmsYesYesYesYesBoost.AlgorithmTimeNoNoYesYesBoost.Chrono

其中,斜体的Yes表示VC 11和GCC 4.7都支持,同时还有非C++11的替代方案,所以很可能在下一版本的KlayGE中使用到。从上面的表可以看出,Library的支持度相当好。即使编译器不支持,也可以很容易地用Boost替换掉。语言核心则还远不到完美,但最常用的基本都已经涵盖了。有些feature,比如foreach和auto,用Boost在库级别支持,对编译速度有很大影响。换用C++11在核心语言级别支持的话应该有较大幅度的编译性能提升。

KlayGE游戏引擎
原创粉丝点击