C ++ 11 funkce (moderní C++)
Tento dokument popisuje funkce nový Standard C++ – označované také jako C ++ 11, které jsou implementovány v aplikaci Visual C++.
C ++ 11 základní jazykové prvky
Visual C++ 2010implementováno mnoho funkcí v C ++ 0 x základní specifikace jazyka, který byl předchůdcem na C ++ 11, a Visual C++ v sadě Visual Studio 2012 hypotézu, která obsahují mnoho C ++ 11 funkcí.V následující tabulce jsou uvedeny C ++ 11 základní funkce jazyka a jejich stav implementace v obou Visual C++ 2010 a Visual C++ v sadě Visual Studio 2012.
VC10 |
VC11 |
|
---|---|---|
verze 2.0 |
v2.1* |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ano |
Ano |
|
verze 1.0 |
verze 1.0 |
|
Ano |
Ano |
|
verze 1.0 |
verze 1.1 |
|
verze 1.0 |
V1.1* * |
|
Ano |
Ano |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ano |
Ano |
|
Ano |
Ano |
|
Částečné |
Ano |
|
Ne |
Ano |
|
Ne |
Ne |
|
Ne |
Ne |
|
TR1 |
Částečné |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ano |
|
Ne |
Ne |
|
Ano |
Ano |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ne |
Ne |
|
Ano |
Ano |
|
Ne |
Ano |
|
Částečné |
Ano |
|
Ano |
Ano |
|
Ne |
Ne |
C ++ 11 základní jazykové prvky: souběžnosti |
VC10 |
VC11 |
---|---|---|
Není k dispozici |
Není k dispozici |
|
Ne |
Ano |
|
Ne |
Ano |
|
Ne |
Ano |
|
Není k dispozici |
Není k dispozici |
|
Ne |
Ano |
|
Ne |
Ne |
|
Ano |
Ano |
|
Ne |
Ne |
|
Ne |
Ne |
|
Částečné |
Částečné |
|
Ne |
Ne |
C ++ 11 základní jazykové prvky: C99 |
VC10 |
VC11 |
---|---|---|
Částečné |
Částečné |
|
Částečné |
Částečné |
|
Ano |
Ano |
|
Není k dispozici |
Není k dispozici |
Zde je Stručná příručka k informacím v tabulkách.
Odkazy rvalue
N1610 "Objasnění inicializaci objektů třídy podle rvalues" pokus včasné Povolit přesunutí sémantiky bez odkazy rvalue.Z této diskuse můžeme ji volat "rvalue odkazy v0.1." Byla nahrazena "odkazy rvalue v1.0." "Odkazy Rvalue verze 2.0", což je jaké práce v Visual C++ 2010 byla založena, zakazuje odkazy rvalue vazbu na lvalues a tím i řešení problémů s větší bezpečnost. "Odkazy rvalue v2.1"upřesňuje toto pravidlo.Zvažte vector<string>::push_back(), která má přetížení push_back(const string&) a push_back(string&&)a v.push_back("strval").Výraz "strval" je řetězec literálu a je lvalue.(Ostatní literály, například na celé číslo 1729, jsou rvalues, ale řetězcové literály jsou zvláštní, protože jsou pole.) Rvalue odkaz pravidla v2.0 said, string&& nelze vytvořit vazbu na "strval" protože "strval" je lvalue a proto push_back(const string&) je pouze životaschopné přetížení.Tím by byl vytvořen dočasný std::string, zkopírujte jej do vektoru a pak zničit dočasného std::string.To nebyl velmi efektivní.Pravidla v2.1 odkazy rvalue rozpoznat tuto vazbu string&& na "strval" by vytvořit dočasnou std::string, a je tato dočasná rvalue.Proto i push_back(const string&) a push_back(string&&) životaschopné a push_back(string&&) je upřednostňována.Dočasný std::string je vyrobeno a pak přesunuty do vektoru.Je to účinnější.
"Odkazy Rvalue v3.0" přidá nová pravidla k automatickému generování přesunout konstruktory a přesunout operátory přiřazení za určitých podmínek.Nicméně to není implementována v Visual C++ v sadě Visual Studio 2012, kvůli omezení času a prostředků.
![]() |
---|
V0.1, verze 1.0, 2.0, v2.1, v3.0 označení jsou již dříve vynalezli z důvodu srozumitelnosti a ukázat vývoj C ++ 11. |
Lambda výrazy
Po lambda funkce byly Uživatel hlasoval do práce papír (verze 0,9) a byly přidány proměnlivých lambda výrazy (verze 1.0), výbor pro normalizaci přepracována formulace.To vyrobené lambda výrazy verze 1.1.Tím došlo k příliš pozdě by mělo být začleněno do Visual C++ 2010, ale ve Visual C++ v sadě Visual Studio 2012.Znění v1.1 lambda výrazy vysvětluje, co se má stát v takových případech rohu odkazující na statické členy nebo vnořené lambda výrazy.To opravuje chyby, které se spouštějí ve složitých lambda výrazy.Kromě toho v Visual C++ v sadě Visual Studio 2012, bez státní příslušnosti lambda výrazy jsou převoditelné na ukazatele na funkci.To není v N2927 znění, ale to se počítá jako součást v1.1 lambda výrazy přesto.FDIS 5.1.2 [expr.prim.lambda]/6 má tento popis: "typ uzávěru pro lambda výraz s lambda sběr má veřejné-virtuální Neprovokativní const převodu funkci pro ukazatel na funkci, mají stejný parametr a typy jako operátor volání funkce typ uzávěru.Hodnota vrácená funkcí tohoto převodu musí být adresa funkci, že při vyvolání, má stejný účinek jako vyvolání operátor volání funkce typ uzávěru. " ( Visual C++ v sadě Visual Studio 2012 Je ještě lepší než je, protože jsme provedli bez státní příslušnosti lambda výrazy převoditelné ukazatelů funkcí, které mají libovolného volání konvencí.To je důležité při použití rozhraní API, které očekávají, že věci jako __stdcall fungovat odkazy.)
decltype
Po decltype byl uživatel hlasoval do práce papír (verze 1.0), malé, ale důležité opravy chyb obdržel na poslední chvíli (verze 1.1).Jedná se o velký zájem programátory, kteří pracují na STL a zesílení.
Výčty se deklarované zadaný a vpřed
Silného výčty byly částečně podporovány v Visual C++ 2010 (konkrétně část explicitně zadané základní typy).Visual C++ v sadě Visual Studio 2012je plně implementuje a také plně implementován C ++ 11 sémantiku pro dopředu deklarováno výčty.
Zarovnání
Ani Visual C++ 2010 ani Visual C++ v sadě Visual Studio 2012 implementovat klíčová slova jazyka základní alignas/alignof z Zarovnání návrh , byl uživatel hlasoval do práce papíru.Visual C++ 2010bylo aligned_storage z TR1.Visual C++ v sadě Visual Studio 2012Přidá aligned_union a std::align() standardní knihovny.
Standardní rozložení a triviální typy
Vystavené změny z N2342 "LUSKU společnosti Revisited; Řešení jádra problému 568 (revize 5) " jsou doplňky z is_trivial a is_standard_layout na <type_traits>.(N2342 přepracována mnoho znění základních, ale je nutné provést žádné změny kompilátor.) Tyto typové vlastnosti byly k dispozici v Visual C++ 2010, ale pouze duplicitní is_pod.Proto v tabulce výše v tomto dokumentu říká "No" podpora.V Visual C++ v sadě Visual Studio 2012, jsou napájeny háky kompilátoru, které jsou navrženy tak, aby správné odpovědi.
přepsat a v konečném znění
To dostalo přes krátký, ale složitý vývoj.Původně, v verze 0.8, byly [override]], [hiding]], a [base_check] atributy.Pak v verze 0,9, atributy byly odstraněny a nahrazeny kontextových klíčových slov.Konečně, v verze 1.0, byly sníženy na "final" na třídách, a "override"a"final" na funkce.To umožňuje rozšíření Ascended protože Visual C++ 2010 již podporována tato "override" informace o syntaxi funkce, a musely sémantiku rozumně blízko v C ++ 11. "final"byl také podporován, ale za jiný pravopis"Uzavřeno".V Visual Studio 2012, standardní pravopis a sémantika "override"a"final" jsou plně podporovány.Další informace naleznete v tématu override – specifikátor a final – specifikátor.
Atomics a další
Atomics, silné porovnat a výměnu, obousměrných oplocení, a řazení dat závislost určit standardní knihovna strojů, které jsou implementovány v Visual C++ v sadě Visual Studio 2012.
Standardní funkce knihovny
Která se vztahuje základní jazyk.Pro C ++ 11 standardní knihovny, nemáme hezké tabulky funkcí, ale Visual C++ v sadě Visual Studio 2012 ho provádět, se dvěma výjimkami.Poprvé, je-li funkce knihovny závisí na funkci, která chybí v kompilátoru, jsme buď simulovat ji vyžaduje – například budeme simulovat šablony variadic pro make_shared<T>()– nebo jsme není implementovat – existuje pouze několik případů, zejména <initializer_list>.Druhý, standardní knihovny C99, což je součást C ++ 11 standardní knihovny, je převážně Neimplementovaný, i když <stdint.h> byla implementována v Visual C++ 2010.Zde je částečný seznam změn v Visual C++ v sadě Visual Studio 2012:
Nová záhlaví:<atomic>, <chrono>, <condition_variable>, <future>, <mutex>, <ratio>, <scoped_allocator>, a <thread>.
D12: podle požadavků C ++ 11, emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() jsou implementovány v všechny kontejnery pro "libovolného" počtem argumentů (viz oddíl "Umělá variadics").Například vector<T> je "template <typename... Args> void emplace_back(Args&&... args)" který prvek typu T na zádi vektoru z libovolného počtu libovolného argumenty předány dokonale konstrukce přímo.To může být efektivnější než push_back(T&&), což by vyžadovalo další přesun konstrukce a zničení.
**Umělé variadics:**Visual C++ v sadě Visual Studio 2012 má nové schéma pro simulaci variadic šablony. V Visual C++ 2008 aktualizace SP1 a Visual C++ 2010, subheaders byly opakovaně zahrnuty s makry definován rozdílně pokaždé, kdy na razítko out přetížení 0, 1, 2, 3 nebo více argumentů.Například <memory> zahrnuty interní subheader <xxshared> opakovaně, aby razítko podle make_shared<T>(args, args, args).V Visual C++ v sadě Visual Studio 2012, subheaders jsou pryč.Šablony variadic, samy jsou nyní definována jako makra (velkým počtem pokračování zpětné lomítko) a potom rozbalit pomocí předlohy maker.Tato změna vnitřní implementace má tyto důsledky:
Kód je udržovatelnější, snadnější použití (přidání subheaders byl nezanedbatelnou část práce) a více čitelné.
Je těžší krok do s ladicím programem – bohužel!
pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) Konstruktoru std::pair "zajímavé" účinky.To vyžaduje N ^ 2 přetížení (v případě, že budeme podporovat až n-10tic, což znamená 121 přetížení, protože prázdné n-tic spočítat zde příliš).
Masivní množství paměti daty mimo tolik pár-n-tice přetížení plus všechny přetížení D12 spotřebováno během kompilace.Proto jsme snížit nekonečno.V Visual C++ 2008 aktualizace SP1 a Visual C++ 2010, nekonečno byl 10 (to znamená "variadic" šablony podporované argumenty 0 až 10, včetně).Ve výchozím nastavení je nekonečno 5 v Visual C++ v sadě Visual Studio 2012.To přináší spotřeba paměti kompilátor zpět do stavu, který byl v Visual C++ 2010.Pokud potřebujete další argumenty (například pokud máte existující kód, který používá 6-n-tic), je únikový poklop.Můžete definovat _VARIADIC_MAX mezi 5 a 10 včetně celého projektu.To spotřebovává více paměti a může vyžadovat použití /Zm možnost kompilátoru vyhradit více místa pro předkompilovaný záhlaví.
**Náhodnosti:**uniform_int_distribution je nyní dokonale nestranná a shuffle() je implementována v <algorithm>, která přijímá přímo jako jednotné generátory náhodných číslo mersenne_twister.
Odolnost proti přetížené adresa z operátorů: C ++ 98/03 zakazuje přetěžování operátoru jeho adresu z elementu kontejneru STL.Toto je třídy, stejně jako CComPtr provedete tak, že pomocné třídy, stejně jako CAdapt byly nezbytné k ochraně STL z takové přetížení.Při vývoji Visual C++ 2010, STL změn jej odmítnout přetížené adresu z operátorů v situacích ještě více.C ++ 11 změněných požadavků tak, aby operátorů přetížených adresa o přijatelné.C ++ 11, a Visual C++ 2010, poskytují podpůrná funkce std::addressof(), které můžete získat hodnotu true adresu objektu bez ohledu na přetěžování operátoru.Před Visual C++ 2010 byla vydána, se můžeme pokusil nahradit výskyty "&elem"s"std::addressof(elem)", což je náležitě odolné.V Visual C++ v sadě Visual Studio 2012, budeme dále jste pryč.Nyní jsme jste auditovány všechny nádoby a všechny iterátory, tak, aby třídy, které přetěžování operátoru jejich adresy z by měla být použitelná v celém STL.
Visual C++ v sadě Visual Studio 2012přesahuje C ++ 11 několika způsoby:
BY iterátorů: podle podmínek, ale to je požadováno C ++ 11 norma byla provedena by iterátory, jak je popsáno ve N2911 "Minimalizaci závislosti v rámci obecné třídy pro rychlejší a menší programy" a N2980 "By iterátor přiřazení a inicializaci, revize 1".
Systém souborů:<filesystem> záhlaví z Návrh TR2 byla přidána.Nabízí recursive_directory_iterator a další zajímavé funkce.Před prací na TR2 byl zablokovat, protože C ++ 0 x byl velmi zpožděný a byla změna c ++ 11, 2006 návrh byl odvozen z Boost.Filesystem V2.Jej později evolved do Boost.Filesystem V3, ale který není implementována v Visual C++ v sadě Visual Studio 2012.
A hlavní optimalizace!Všechny naše kontejnery jsou nyní optimálně malé uveden jejich aktuální vyjádření.Jedná se o objekty kontejneru, samy o sobě, ne k jejich obsahu poukázala na.Například std::vector obsahuje tři raw ukazatele.V Visual C++ 2010, režimu, vydání x 86 std::vector bylo 16 bajtů.V Visual C++ v sadě Visual Studio 2012, je 12 bajtů, což je optimální malé.Toto je velká koupě – máte-li 100 000 vektorů v programu Visual C++ v sadě Visual Studio 2012 ušetříte 400 000 bajtů.Využití paměti poklesu uloží v prostoru a čase.
Bylo toho dosaženo vyloučením skladování prázdných allocators a comparators, protože std::allocator a std::less jsou bezstavové.(Tato optimalizace jsou povoleny pro vlastní allocators na comparators příliš, tak dlouho, dokud jsou bezstavové.Samozřejmě úložiště stavové allocators na comparators se jim vyhnout nelze, ale to jsou jen velmi zřídka.)
Velikost kontejneru
Následující tabulky popisují velikosti kontejneru v bajtech pro platformy x 86 a x 64.(32-bit ARM odpovídá x 86 pro tyto účely).Tyto tabulky pokrytí režim vydání, protože režim ladění obsahuje kontrolní strojního zařízení, která spotřebovává místa a času.Samostatné sloupce jsou pro Visual C++ 2008 SP1, kde _SECURE_SCL převezme 1 a pro Visual C++ 2008 SP1 s _SECURE_SCL ručně nastavit na hodnotu 0 pro maximální rychlost.Visual C++ 2010and Visual C++ v sadě Visual Studio 2012 default _SECURE_SCL to 0 (now known as _ITERATOR_DEBUG_LEVEL).
x 86 kontejneru velikost (bajty) |
VC9 SP1 |
VC9 SP1 SCL = 0 |
VC10 |
VC11 |
---|---|---|---|---|
vektor <int> |
24 |
16 |
16 |
12 |
pole < int, 5 > |
20 |
20 |
20 |
20 |
deque <int> |
32 |
32 |
24 |
20 |
forward_list <int> |
Není k dispozici |
Není k dispozici |
8 |
4 |
Seznam <int> |
28 |
12 |
12 |
8 |
priority_queue <int> |
28 |
20 |
20 |
16 |
fronta <int> |
32 |
32 |
24 |
20 |
Zásobník <int> |
32 |
32 |
24 |
20 |
pár < int, int > |
8 |
8 |
8 |
8 |
n-tice < int, int, int > |
16 |
16 |
16 |
12 |
Mapa < int, int > |
32 |
12 |
16 |
8 |
Vícenásobné mapování < int, int > |
32 |
12 |
16 |
8 |
nastavení <int> |
32 |
12 |
16 |
8 |
multimnožina <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 |
x 64 kontejneru velikost (bajty) |
VC9 SP1 |
VC9 SP1 SCL = 0 |
VC10 |
VC11 |
---|---|---|---|---|
vektor <int> |
48 |
32 |
32 |
24 |
pole < int, 5 > |
20 |
20 |
20 |
20 |
deque <int> |
64 |
64 |
48 |
40 |
forward_list <int> |
Není k dispozici |
Není k dispozici |
16 |
8 |
Seznam <int> |
56 |
24 |
24 |
16 |
priority_queue <int> |
56 |
40 |
40 |
32 |
fronta <int> |
64 |
64 |
48 |
40 |
Zásobník <int> |
64 |
64 |
48 |
40 |
pár < int, int > |
8 |
8 |
8 |
8 |
n-tice < int, int, int > |
16 |
16 |
16 |
12 |
Mapa < int, int > |
64 |
24 |
32 |
16 |
Vícenásobné mapování < int, int > |
64 |
24 |
32 |
16 |
nastavení <int> |
64 |
24 |
32 |
16 |
multimnožina <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 |
Stručná referenční příručka k aplikaci Visual C++ verze čísla
Visual C++ obsahuje různé "čísla verzí" v závislosti na tom, kde hledat.Značkové verze (vytištěn na poli), interní verze (zobrazené v o dialogové okno) a verze kompilátoru (zobrazeny podle cl.exe a _MSC_VER makro).
Číslo verze značkové |
Vnitřní číslo verze |
#define _MSC_VERčíslo verze |
---|---|---|
Visual C++ 2005 |
VC8 |
1400 |
Visual C++ 2008 |
VC9 |
1500 |
Visual C++ 2010 |
VC10 |
1600 |
Visual C++ v sadě Visual Studio 2012 |
VC11 |
1700 |
_MSC_VER Makro je zajímavé osoby, které mají mít různé hlavní verze Visual C++ a posílat jiný kód pro ně.
Viz také
Referenční dokumentace
Příkaz For založený na rozsahu (C++)
Další zdroje
Moderní Příručka programování v jazyce C++