C++11 の機能 (Modern C++)
このドキュメントでは、Visual C++ で実行される C++11 と呼ばれる新しい C++ 標準またはの機能をとして示します。
C++11 コア言語機能
Visual C++ 2010 は前駆 C++11物質が見つかり、Visual Studio 2012 の Visual C++ には、多くの C++11 機能を含むように配置します C++0x のコア言語仕様の多くの機能を実装します。次の表は Visual C++ 2010 と Visual Studio 2012 の Visual C++両方の C++11 コア言語機能と実装の状態を示します。
VC10 |
VC11 |
|
---|---|---|
v2.0 |
v2.1* |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
X |
|
○ |
○ |
|
v1.0 |
v1.0 |
|
○ |
○ |
|
v1.0 |
v1.1 |
|
v1.0 |
**] |
|
○ |
○ |
|
X |
X |
|
X |
X |
|
X |
X |
|
○ |
○ |
|
○ |
○ |
|
Partial |
○ |
|
X |
○ |
|
X |
X |
|
X |
X |
|
TR1 |
Partial |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
X |
|
X |
○ |
|
X |
X |
|
○ |
○ |
|
X |
X |
|
X |
X |
|
X |
X |
|
○ |
○ |
|
X |
○ |
|
Partial |
○ |
|
○ |
○ |
|
X |
X |
C++11 コア言語機能: 同時実行 |
VC10 |
VC11 |
---|---|---|
N/A |
N/A |
|
X |
○ |
|
X |
○ |
|
X |
○ |
|
N/A |
N/A |
|
X |
○ |
|
X |
X |
|
○ |
○ |
|
X |
X |
|
X |
X |
|
Partial |
Partial |
|
X |
X |
C++11 コア言語機能: C99 |
VC10 |
VC11 |
---|---|---|
Partial |
Partial |
|
Partial |
Partial |
|
○ |
○ |
|
N/A |
N/A |
テーブルの情報にすばやくガイドを次に示します。
rvalue 参照
クラスの初期化 N1610 "ついて rvalue によってオブジェクトが" は rvalue 参照しないで移動セマンティクスを有効にする前の試行はありません。ここでは、これを "rvalue 参照 v0.1 呼び出すします"。はこれが "rvalue 参照 v1.0に置き換えられました"。Visual C++ 2010 の作業に基づいてとおりである "右辺値からバインディング左辺値に" は v2.0、rvalue 参照を禁止します。これにより、主要なセキュリティ問題を修正参照します。"rvalue 参照は v2.1 "この規則を定義します。vector<string>::push_back()、オーバーロード push_back(const string&) と push_back(string&&)場合は v.push_back("strval")使用を検討してください。"strval" 式はリテラル文字列であり、値です。他のリテラル (たとえば、整数 1729 は、rvalue ですが、配列であるため、リテラル文字列は特殊です)。rvalue 参照 v2.0 の規則はどのようなコメントが残されたため、"strval" が左辺値であり、push_back(const string&) が実行できる唯一のオーバーロードであるため string&& は "strval" にバインドすることはできません。これは一時的な std::stringを作成し、ベクターにコピーし、一時的な std::stringを破棄します。これは、非常に有効ではありません。rvalue 参照 v2.1 の規則は string&& を "strval" にバインドして一時的な std::stringを作成すると、一時的 rvalue がであることを確認します。したがって、push_back(const string&) と push_back(string&&) は、実行可能であり、push_back(string&&) はください。一時 std::string、ベクターにされ、実行されます。これは効率的です。
"参照 v3.0" 右辺値は自動的に移動コンストラクターを生成し、代入演算子を、特定の条件下で実行する新しい規則を追加します。ただし、これは時間とリソースの制約による Visual Studio 2012 の Visual C++では実装されません。
注意 |
---|
v0.1 は、v1.0、v2.0、v2.1 v3.0 の指定 C++11.の進化を示すために、わかりやすくするために作成されます。 |
Lambdas
ラムダ関数 が作業用紙 (バージョン 0.9) にポーリングされた後、変更可能なラムダ (バージョン 1.0) が追加されましたが、標準化委員会が言葉遣い分解を確認します。これは、ラムダ バージョン 1.1が生成されました。これは Visual C++ 2010に組み込まれるには大きすぎる遅延が発生 Visual Studio 2012 の Visual C++にあります。ラムダ v1.1 の言葉遣いは静的メンバーまたは入れ子になったラムダを示すことが望ましいときの動作は、角度のケースに明確にします。これは、複雑なラムダによってトリガーされたバグを修正します。また Visual Studio 2012 の Visual C++に、ステートレスのラムダ関数はに変換可能ポインターです。これは N2927 言葉遣いではなく、ラムダ v1.1 の一部としてそのままカウントされます。FDIS 5.1.2]/[expr.prim.lambda 6 この説明を含んでいます: "ラムダのないキャプチャ ラムダ式のクロージャの型にクロージャの型の関数呼び出し演算子と同じパラメーターと戻り値の型を持つ関数へのポインターにパブリック非仮想の非 const の明示的な変換の関数があります。この変換関数によって返される値は、関数のアドレスで呼び出された場合に、発生、開始することと同じですクロージャの型の関数呼び出し演算子を"。(Visual Studio 2012 の Visual C++ は、任意の呼び出し規約がある機能するためにステートレス ラムダをポインターに変換可能で作成したので、それより優先されます。これは __stdcall の関数ポインターなどを受け取る API を使用しているときに重要です)。
decltype
decltype は、用紙作業 (バージョン 1.0) にポーリングすると、より重要なバグ修正の直前の分で受信した (バージョン 1.1)。これは、STL と Boost を行うプログラマに大きな対象としています。
厳密に型指定されたを続行または列挙型を宣言しました
厳密に型指定された列挙型 部分的に Visual C++ 2010 (具体的には、明示的に指定された基になる型の一部) でがサポートされていました。Visual Studio 2012 の Visual C++ は完全に実装し、また十分に C++11 セマンティクスを 転送が、列挙体を宣言しました実装します。
[配置]
Visual C++ 2010、または、Visual Studio 2012 の Visual C++ の実装作業にポーリングする用紙の 配置の提案 コアの言語キーワード alignas/alignof。Visual C++ 2010 に TR1 の aligned_storage がありました。Visual Studio 2012 の Visual C++ は、標準ライブラリに aligned_union と std::align() を追加します。
標準レイアウトと単純型
公開された変更はから N2342 "もう一度使用される POD; 解決できる問題コア 568 (5) を" 変更<type_traits>へ is_trivial と is_standard_layout の追加です。(N2342 は多くのコア言語の言葉遣いを改めましたが、コンパイラの変更は必要ではありません。これらの型の特徴は Visual C++ 2010に置かれていましたが、is_podをレプリケート。したがって、このドキュメントの表は、前に "いいえ" を言いませんサポートされていません。Visual Studio 2012 の Visual C++では正確な応答を提供する、解像度に依存しないコンパイラ フックです。
オーバーライドと最終
これは短く複雑な進化して行きました。もともと、version 0.8 では、[[override]]、[[hiding]]、および [[base_check]] 属性があります。次に、バージョン 0.9属性はコンテキスト キーワードと削除され、置き換えられました。最後に バージョン 1.0、クラスのfinal ""、および "" overrideと関数の "" finalに減っています。これは Visual C++ 2010 が既に関数の "" のoverrideこの構文をサポートし、C++11.でそれらの近くのセマンティクスが妥当であったために発生した拡張子を返します。"finalは"、がサポートされていましたが、別のスペルの下に "シールされています"。Visual Studio 2012では、override "" および "" finalの標準のスペルとセマンティクスは完全にサポートされます。詳細については、「override 指定子」および「final 指定子」を参照してください。
は、多く
アトミック厳密な比較し、交換します。双方向フェンス、データ依存関係の順序Visual Studio 2012 の Visual C++で実行される標準ライブラリのコンピューターなどを指定します。
標準ライブラリの機能
そのコア言語について説明します。C++11 標準ライブラリについては、が機能の明確なテーブルはありませんが、Visual Studio 2012 の Visual C++ は、2 種類の例外を除き、を実装します。最初にライブラリの機能がコンパイラに不足している機能に依存する場合は、いずれかの例は、要求の make_shared<T>()の variadic テンプレートをシミュレートするシミュレートします。または、は、そこは、いくつかのケースのみ、特に、<initializer_list>実行されません。第 2 に、C++11 標準ライブラリに参照によって組み込まれる C99 標準ライブラリは、<stdint.h> が Visual C++ 2010に実行されたが、主に実装されていないです。Visual Studio 2012 の Visual C++の変更部分の一覧を次に示します。:
新しいヘッダー:<atomic>、<chrono>、<condition_variable>、<future>、<mutex>、<ratio>、<scoped_allocator>と <thread>。
C++11、emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() に 必要な、布置: は、"オプション" 回数実行されます ( "のど variadics" セクションのすべてのコンテナーを参照)。たとえば、vector<T> には "template <typename... Args> void emplace_back(Args&&... args)" があり、これは任意の数の任意の引数の後ろで直接 T 型の要素を構築し、完璧にフォーワードされます。これは、その移動構築と破棄を含む push_back(T&&)よりもあります。
**のどの variadics:**Visual Studio 2012 の Visual C++ に variadic テンプレートをモデル化するための新しい設定があります。Visual C++ 2008 SP1 と Visual C++ 2010では、subheaders 0 は異なる方法で定義されるたびに、マクロと繰り返し 1、2、3 回以上のオーバーロードを押すように、含まれていました。たとえば、<memory> は make_shared<T>(args, args, args)を押すように内部 subheader <xxshared> を繰り返し含まれていました。Visual Studio 2012 の Visual C++では、subheaders はなくなります。これで variadic テンプレートは、マクロと (バックスラッシュ継続の多くに) 定義され、マスター マクロを使用して配置されます。この内部実装の変更は、これらの動作をします:
コードの管理する、簡単に使用できます (subheaders を追加すると、の作業量のものです)、および読みやすく。
デバッガーはのとにステップ インすることは困難です。
std::pair の pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) のコンストラクターは、"" の間の効果を説明しました。これは N^2 オーバーロードが必要です (空のタプルが、ここでないため、これは、10) までその場合、121 のオーバーロードを過度に意味します)。
布置すべてのオーバーロードとは多くのペア タプルのオーバーロードを、無バーに送信して、コンパイル中にメモリの莫大な量が実行されました。したがって、は、無限を減らしました。Visual C++ 2008 SP1 と Visual C++ 2010では、無限大は 10 です (つまり、"" variadic ボックス テンプレートは 0 から 10 レベルの引数、包括サポートしていました)。既定では、Visual Studio 2012 の Visual C++の無限大は 5 です。これは、Visual C++ 2010にいたポリシーにコンパイラのメモリ使用量を返します。より多くの引数を 6 組を使用する既存のコードがある場合は、(たとえば) 必要な場合は、エスケープ ハッチがあります。包括 5 から 10 までのプロジェクト全体の _VARIADIC_MAX を定義できます。これはメモリを実行し、プリコンパイル済みヘッダーにより多くのスペースを確保する /Zm のコンパイラ オプションを使用する必要があります。
**無作為性:**uniform_int_distribution は、完全に公平です shuffle() は <algorithm>に実装されますが、直接 mersenne_twisterなどの統一された乱数ジェネレーターを受け入れます。
アドレス演算子のオーバーロードに対する抵抗: C++98/03 は、アドレス演算子をオーバーロードから、STL コンテナーの要素を禁止しました。これは、このようなオーバーロードから STL を保護することを CAdapt のようなヘルパー クラスが要求されたようにする並べ替える CComPtr のものです。Visual C++ 2010の開発時に、STL 拒否するように指定できます。また状態のアドレス演算子のオーバーロード変更します。C++11 は、アドレス演算子をオーバーロード使用可能にする条件を変更しました。C++11 と Visual C++ 2010は、演算子のオーバーロードに関係なく、オブジェクトの実際のアドレスを取得できるヘルパー関数 std::addressof()を提供します。Visual C++ 2010 が解放される前に、"" と "" std::addressof(elem)&elemの生成を置き換えるようにしました適切に抵抗力がある。Visual Studio 2012 の Visual C++では、さらにの順に進んでいました。ここで、アドレス演算子、をオーバーロードするクラスは、STL 全体で使用可能になるように、すべてのコンテナーとすべての反復子を監査しています。
Visual Studio 2012 の Visual C++ は、複数の方法で C++11 にとどまりません:
でき、標準説明されている 高速化のジェネリック クラスと小さいプログラム内の依存関係を最小限に抑える "" N2911N2980 "恐い反復子の割り当ておよび初期化のリビジョン 1 "ように C++11 から要求されないように恐い反復子: 恐い反復子は、実装されています。
ファイルシステム: は <filesystem> のヘッダーから 提案 TR2 追加されました。これは recursive_directory_iterator およびそのほかの重要な機能が用意されています。C++0x がきわめて低速であり、実行 C++11 に変更するため TR2 の作業が固定前に、2006 年の推奨事項はから Boost.Filesystem V2派生しています。これは Boost.Filesystem V3 に配置しましたが、Visual Studio 2012 の Visual C++では実装されません。
と主な最適化!現在の表示を持つ、すべてのコンテナーは、最上位に小さい。これは、コンテンツ ポイントにそののへのコンテナー オブジェクト自体は、示します。たとえば、std::vector は、3 種類の生のポインターが格納されます。Visual C++ 2010では、x86 のリリース モード、std::vector は 16 バイトです。Visual Studio 2012 の Visual C++で、最上位に小さい場合は 12 バイトです。これには、プログラムで 100,000 のベクターがある場合へ Visual Studio 2012 の Visual C++ 大きいため、400,000 バイト保存します。の使用は、メモリ空間と時刻の両方を節約できます。
これは空のアロケーターと比較子のストレージを避けることによって std::allocator と std::less は状態非依存であるため、実行されました。(これらの最適化は、カスタム アロケーターと比較子に対して状態非依存である限り、非常に有効になります。当然ながら、stateful アロケーターと比較子のストレージは回避できませんが、きわめてまれです)。
コンテナーのサイズ
次の表は、x86 および x64 プラットフォームのサイズ (バイト単位) コンテナーのサイズを示します。32 ビット (ARM がこれらの目的の x86 と同じです)。デバッグ モードが領域と時間を実行するコンピューターなどのチェックが含まれているため、これらの表は、のリリース モード。別の列が _SECURE_SCL が 1 に設定 _SECURE_SCL、を使用してそのスケジューラの Visual C++ 2008 SP1 のように手動で最高速度の 0 に設定します Visual C++ 2008 SP1 の場合です。Visual C++ 2010 と Visual Studio 2012 の Visual C++ は 0 に _SECURE_SCL の既定値 (_ITERATOR_DEBUG_LEVELとして知られています)。
x86 のコンテナーのサイズ (バイト) |
VC9 SP1 |
VC9 SP1 SCL=0 |
VC10 |
VC11 |
---|---|---|---|---|
ベクター<int> |
24 |
16 |
16 |
12 |
配列<int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
32 |
32 |
24 |
20 |
forward_list<int> |
N/A |
N/A |
8 |
4 |
リスト<int> |
28 |
12 |
12 |
8 |
priority_queue<int> |
28 |
20 |
20 |
16 |
キュー<int> |
32 |
32 |
24 |
20 |
スタック<int> |
32 |
32 |
24 |
20 |
ペア<int, int> |
8 |
8 |
8 |
8 |
タプル<int, int, int> |
16 |
16 |
16 |
12 |
マップ<int, int> |
32 |
12 |
16 |
8 |
map<int, int> |
32 |
12 |
16 |
8 |
<int>を設定します。 |
32 |
12 |
16 |
8 |
多重セット<int> |
32 |
12 |
16 |
8 |
hash_map<int, int> |
72 |
44 |
44 |
32 |
hash_multimap<int, int> |
72 |
44 |
44 |
32 |
hash_set<int> |
72 |
44 |
44 |
32 |
hash_multiset<int> |
72 |
44 |
44 |
32 |
unordered_map<int, int> |
72 |
44 |
44 |
32 |
unordered_multimap<int, int> |
72 |
44 |
44 |
32 |
unordered_set<int> |
72 |
44 |
44 |
32 |
unordered_multiset<int> |
72 |
44 |
44 |
32 |
string |
28 |
28 |
28 |
24 |
wstring |
28 |
28 |
28 |
24 |
x64 コンテナーのサイズ (バイト) |
VC9 SP1 |
VC9 SP1 SCL=0 |
VC10 |
VC11 |
---|---|---|---|---|
ベクター<int> |
48 |
32 |
32 |
24 |
配列<int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
64 |
64 |
48 |
40 |
forward_list<int> |
N/A |
N/A |
16 |
8 |
リスト<int> |
56 |
24 |
24 |
16 |
priority_queue<int> |
56 |
40 |
40 |
32 |
キュー<int> |
64 |
64 |
48 |
40 |
スタック<int> |
64 |
64 |
48 |
40 |
ペア<int, int> |
8 |
8 |
8 |
8 |
タプル<int, int, int> |
16 |
16 |
16 |
12 |
マップ<int, int> |
64 |
24 |
32 |
16 |
map<int, int> |
64 |
24 |
32 |
16 |
<int>を設定します。 |
64 |
24 |
32 |
16 |
多重セット<int> |
64 |
24 |
32 |
16 |
hash_map<int, int> |
144 |
88 |
88 |
64 |
hash_multimap<int, int> |
144 |
88 |
88 |
64 |
hash_set<int> |
144 |
88 |
88 |
64 |
hash_multiset<int> |
144 |
88 |
88 |
64 |
unordered_map<int, int> |
144 |
88 |
88 |
64 |
unordered_multimap<int, int> |
144 |
88 |
88 |
64 |
unordered_set<int> |
144 |
88 |
88 |
64 |
unordered_multiset<int> |
144 |
88 |
88 |
64 |
string |
40 |
40 |
40 |
32 |
wstring |
40 |
40 |
40 |
32 |
Visual C++ のバージョン番号に関するクイック リファレンス ガイド
場所によって表示される Visual C++ に異なるバージョン番号 "" があります。決め付けられたバージョン (ボックスで出力される)、内部バージョン (について のダイアログ ボックスに表示されます)、およびコンパイラのバージョンがあります (cl.exe と _MSC_VER のマクロで表示)。
決め付けられたバージョン番号 |
内部バージョン番号 |
#define _MSC_VER のバージョン番号 |
---|---|---|
Visual C++ 2005 |
VC8 |
1400 |
Visual C++ 2008 |
VC9 |
1500 |
Visual C++ 2010 |
VC10 |
1600 |
Visual Studio 2012 の Visual C++ |
VC11 |
1700 |
_MSC_VER のマクロは Visual C++ の異なるメジャー バージョンを対象とし、それらの別のコードを出力するユーザーに興味深いです。