Sdílet prostřednictvím


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.

C ++ 11 základní jazykové prvky

VC10

VC11

Odkazy rvalue v0.1, v1.0, verze 2.0, v2.1, v3.0

verze 2.0

v2.1*

Kvalifikátory REF

Ne

Ne

Inicializátory data Nestatický člen

Ne

Ne

Šablony Variadic v0.9, v1.0

Ne

Ne

Inicializační seznamy

Ne

Ne

static_assert

Ano

Ano

Automatické v0.9, v1.0

verze 1.0

verze 1.0

Koncové návratové typy

Ano

Ano

Lambda výrazy v0.9, v1.0, v1.1

verze 1.0

verze 1.1

decltype v1.0, v1.1

verze 1.0

V1.1* *

Pravé ostré závorky

Ano

Ano

Výchozí šablony argumentů pro funkci šablony

Ne

Ne

Výraz SFINAE

Ne

Ne

Šablony alias

Ne

Ne

Externí šablony

Ano

Ano

nullptr

Ano

Ano

Silného výčty

Částečné

Ano

Dopředu deklarováno výčty

Ne

Ano

Atributy

Ne

Ne

constexpr

Ne

Ne

Zarovnání

TR1

Částečné

Delegování konstruktory

Ne

Ne

Dědění konstruktory

Ne

Ne

Explicitní převod operátorů

Ne

Ne

char16_t

Ne

Ne

Řetězcové literály Unicode

Ne

Ne

Surový řetězcové literály

Ne

Ne

Názvy univerzální znakové literály

Ne

Ne

Uživatelem definované literály

Ne

Ne

Standardní rozložení a triviální typy

Ne

Ano

Převezme a odstranění funkce

Ne

Ne

Rozšířené prohlášení přítele

Ano

Ano

Rozšířené

Ne

Ne

Obory názvů vloženého

Ne

Ne

Neomezený sjednocení

Ne

Ne

Místní a nepojmenovaných typů jako argumenty šablony

Ano

Ano

Na základě rozsahu cyklu for

Ne

Ano

přepsat a koncový v0.8, v0.9, v1.0

Částečné

Ano

Minimální podpora GC

Ano

Ano

noexcept

Ne

Ne

C ++ 11 základní jazykové prvky: souběžnosti

VC10

VC11

Ustanovení bodů sekvence

Není k dispozici

Není k dispozici

Atomics

Ne

Ano

Silné porovnat a výměnu

Ne

Ano

Obousměrné oplocení

Ne

Ano

Paměťový model

Není k dispozici

Není k dispozici

Řazení dat závislost

Ne

Ano

Řazení dat závislost: funkci poznámky

Ne

Ne

exception_ptr

Ano

Ano

quick_exit

Ne

Ne

Atomics v obslužné rutině signál

Ne

Ne

Místní úložiště

Částečné

Částečné

Kouzelná Statistika

Ne

Ne

C ++ 11 základní jazykové prvky: C99

VC10

VC11

__func__

Částečné

Částečné

Preprocesor C99

Částečné

Částečné

dlouhé dlouhé

Ano

Ano

Rozšířené typy integer

Není k dispozici

Není k dispozici

Zde je Stručná příručka k informacím v tabulkách.

Hh567368.collapse_all(cs-cz,VS.110).gifOdkazy 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ů.

Poznámka k upozorněníUpozornění

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.

Hh567368.collapse_all(cs-cz,VS.110).gifLambda 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.)

Hh567368.collapse_all(cs-cz,VS.110).gifdecltype

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í.

Hh567368.collapse_all(cs-cz,VS.110).gifVýč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.

Hh567368.collapse_all(cs-cz,VS.110).gifZarovná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.

Hh567368.collapse_all(cs-cz,VS.110).gifStandardní 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.

Hh567368.collapse_all(cs-cz,VS.110).gifpř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.

Hh567368.collapse_all(cs-cz,VS.110).gifAtomics 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.

Hh567368.collapse_all(cs-cz,VS.110).gifStandardní 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.)

Hh567368.collapse_all(cs-cz,VS.110).gifVelikost 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

Lambda výrazy v jazyce C++

Příkaz For založený na rozsahu (C++)

Další zdroje

Moderní Příručka programování v jazyce C++

C++ jazyková Reference

Referenční Standardní knihovna C++

Blog týmu Visual C++