Udostępnij za pośrednictwem


C ++ funkcje 11 (C++ nowoczesny)

W tym dokumencie opisano cechy nowy Standard C++ — znany również jako C ++ 11 — które są realizowane w programie Visual C++.

C ++ 11 podstawowe funkcje języka

Visual C++ 2010realizowane wiele funkcji w C ++ 0 x core specyfikacja języka, który był prekursorem do C ++ 11, i Visual C++ w programie Visual Studio 2012 rozszerza się na tym, aby uwzględnić wiele C ++ 11 funkcje.W poniższej tabeli zestawiono C ++ 11 podstawowe funkcje językowe i stanu ich wykonania, w obu Visual C++ 2010 i Visual C++ w programie Visual Studio 2012.

C ++ 11 podstawowe funkcje języka

VC10

VC11

Referencję v0.1, wersja 1.0, v2.0, v2.1, v3.0

wersja 2.0

v2.1*

Kwalifikatory REF

Nie

Nie

Inicjatory Członkowskich danych niestatyczny

Nie

Nie

Zmienne szablony v0.9, wersja 1.0

Nie

Nie

List

Nie

Nie

static_assert

Tak

Tak

Auto v0.9, wersja 1.0

Wersja 1.0

Wersja 1.0

Końcowe zwracanymi typami

Tak

Tak

Lambdas v0.9, wersja 1.0, w wersji 1.1

Wersja 1.0

Wersja 1.1

decltype wersja 1.0, w wersji 1.1

Wersja 1.0

V1.1* *

Prawy nawias ostry

Tak

Tak

Domyślny szablon argumentów dla funkcji

Nie

Nie

Wyrażenie SFINAE

Nie

Nie

Szablony alias

Nie

Nie

Szablony extern

Tak

Tak

nullptr

Tak

Tak

Jednoznacznie określony typ wyliczenia

Częściowe

Tak

Do przodu zadeklarowane teksty stałe

Nie

Tak

Atrybuty

Nie

Nie

constexpr

Nie

Nie

Wyrównanie w

TR1

Częściowe

Delegowanie konstruktorów

Nie

Nie

Dziedziczenie konstruktorów

Nie

Nie

Operatory konwersji jawnej

Nie

Nie

wersję char16_t

Nie

Nie

Literały ciągów znaków Unicode

Nie

Nie

Literały ciągów znaków RAW

Nie

Nie

Nazwy charakter uniwersalny w literałach

Nie

Nie

Literały zdefiniowane przez użytkownika

Nie

Nie

Typy układ normy i banalne

Nie

Tak

Niewykonanie zobowiązania i usunięte funkcje

Nie

Nie

Rozszerzone deklaracje przyjaciel

Tak

Tak

Rozszerzone

Nie

Nie

Wbudowane przestrzenie nazw

Nie

Nie

Bez ograniczeń unie

Nie

Nie

Lokalne i nienazwane typy jako argumenty szablonu

Tak

Tak

Oparte na zakresie Pętla for

Nie

Tak

override i final v0.8, v0.9, wersja 1.0

Częściowe

Tak

Minimalnego wsparcia GC

Tak

Tak

noexcept

Nie

Nie

C ++ 11 podstawowe funkcje językowe: współbieżności

VC10

VC11

Przeredagowane punkty sekwencji

Nie dotyczy

Nie dotyczy

Atomics

Nie

Tak

Porównaj silne i wymiany

Nie

Tak

Dwukierunkowy ogrodzenia

Nie

Tak

Model pamięci

Nie dotyczy

Nie dotyczy

Zamówienia współzależność danych

Nie

Tak

Zamówienia współzależność danych: funkcja adnotacji

Nie

Nie

exception_ptr

Tak

Tak

quick_exit

Nie

Nie

Operacji atomowych w procedurach obsługi sygnału

Nie

Nie

Pamięci lokalnej wątku

Częściowe

Częściowe

Magia statyka

Nie

Nie

C ++ 11 podstawowe funkcje językowe: C99

VC10

VC11

__func__

Częściowe

Częściowe

C99 preprocessor

Częściowe

Częściowe

długi

Tak

Tak

Rozszerzone typu integer

Nie dotyczy

Nie dotyczy

Oto krótki przewodnik informacje w tabelach.

Hh567368.collapse_all(pl-pl,VS.110).gifR-referencje

N1610 "Wyjaśnienie inicjowania obiektów klas przez rvalues" została podjęta próba początku umożliwiające ruch semantyki bez referencję.Ze względu na tej dyskusji spróbujmy nazwać "r-wartości odwołuje się v0.1." Został zastąpiony przez "referencję wersja 1.0." "Referencję v2.0", który jest co pracy w Visual C++ 2010 został oparty na, zabrania referencję związany z l-wartości i tym samym ustalenia na problemy bezpieczeństwa głównych. "Referencję v2.1"usprawnia tę regułę.Należy rozważyć vector<string>::push_back(), który ma przeciążenia push_back(const string&) i push_back(string&&), a wezwanie v.push_back("strval").Wyrażenie "strval" jest ciągiem literału, a to lvalue.(Inne literały, na przykład całkowitą 1729, są rvalues, ale literały ciągów znaków są specyficzne, ponieważ są to tablice). R-wartości odwołuje się do reguł v2.0 powiedział, string&& nie można powiązać z "strval" ponieważ "strval" jest lvalue i w związku z tym, push_back(const string&) jest jedyną realną przeciążenie.Spowodowałoby to utworzenie tymczasowego std::string, skopiować go do wektora, a następnie zniszczyć tymczasowym std::string.Nie będzie to bardzo wydajny.Reguły r-wartości odniesienia v2.1 uznają wagę wiążących string&& do "strval" spowodowałoby utworzenie tymczasowego std::string, i agencji pracy jest r-wartości.W związku z tym, zarówno push_back(const string&) i push_back(string&&) rentowność, harmonogram i push_back(string&&) jest preferowana.Tymczasowego std::string jest zbudowane, a następnie przeniósł się do funkcji globalnej vector.Jest to bardziej skuteczne.

"R-referencje v3.0" dodaje nowe reguły do automatycznego generowania konstruktorów ruch i przenieść operatory przypisania pod pewnymi warunkami.Jednak nie jest to realizowane w Visual C++ w programie Visual Studio 2012, ze względu na ograniczenia czasu i zasobów.

Informacje dotyczące przestrogiPrzestroga

V0.1, wersja 1.0, 2.0, wersja 2.1, nazw v3.0 są własna, dla jasności i pokazanie rozwoju C ++ 11.

Hh567368.collapse_all(pl-pl,VS.110).gifLambdas

Po Funkcje lambda zostały poddane pod głosowanie w dokumencie roboczym (wersji 0,9) oraz dodawania tych lambdas (w wersji 1.0), Komitet Normalizacyjny po przeglądzie sformułowania.Świadczyło to o lambdas w wersji 1.1.Problem ten wystąpił już za późno do włączenia do Visual C++ 2010, ale to w Visual C++ w programie Visual Studio 2012.Sformułowanie v1.1 lambdas wyjaśnia, co ma nastąpić w przypadkach narożnika, takich jak odnoszące się do elementy statyczne lub zagnieżdżonych lambdas.Poprawki błędów, które są wywoływane przez złożone lambdas.Dodatkowo w Visual C++ w programie Visual Studio 2012, lambdas bezstanowej są zamienne do wskaźników funkcji.Nie jest to sformułowanie N2927, ale jest mimo to liczony jako część lambdas w wersji 1.1.FDIS 5.1.2 [expr.prim.lambda]/6 ma taki opis: "Typ zamknięcia dla wyrażenia lambda z lambda przechwytywania posiada publicznych-virtual jawne const konwersji funkcję wskaźnika do funkcji posiadające te same typy parametru i powrotu jako operator wywołanie funkcji Typ zamknięcia.Wartość zwracana przez tę funkcję konwersji może być adres funkcji czy, po wywołaniu, ma taki sam skutek jak wywoływanie operator wywołanie funkcji Typ zamknięcia. " ( Visual C++ w programie Visual Studio 2012 Jest jeszcze lepszy niż ten, ponieważ wprowadziliśmy bezstanowej lambdas zamiennych na akcje wskaźników funkcji, które mają dowolnego konwencji wywoływania.Jest to ważne, gdy używana jest interfejsów API, które oczekują rzeczy, jak __stdcall funkcjonować wskaźniki.)

Hh567368.collapse_all(pl-pl,VS.110).gifdecltype

Po decltype został wybrany w dokumencie roboczym (w wersji 1.0), otrzymał mały, ale ważne poprawki błędów w ostatniej chwili (w wersji 1.1).To jest bardzo interesujące dla programistów, którzy pracują na STL i zwiększenie wydajności.

Hh567368.collapse_all(pl-pl,VS.110).gifZdecydowanie teksty stałe zadeklarowane Typed/do przodu

Jednoznacznie określony typ wyliczenia częściowo były obsługiwane w Visual C++ 2010 (w szczególności część o jawnie określonych typów podstawowych).Visual C++ w programie Visual Studio 2012w pełni zaimplementowano je, a także w pełni implementuje C ++ 11 semantyka dla do przodu zadeklarowane teksty stałe.

Hh567368.collapse_all(pl-pl,VS.110).gifWyrównanie

Ani Visual C++ 2010 ani Visual C++ w programie Visual Studio 2012 zaimplementować słowa kluczowe języka podstawowego alignas/alignof z wniosek wyrównanie który został wybrany w dokumencie roboczym.Visual C++ 2010miał aligned_storage z TR1.Visual C++ w programie Visual Studio 2012dodaje aligned_union i std::align() do biblioteki standardowej.

Hh567368.collapse_all(pl-pl,VS.110).gifUkład normy i banalne typów

Narażonych zmiany z N2342 "jest ponownie POD; Rozwiązywanie Core problemu 568 (5 poprawek) " polegają na is_trivial i is_standard_layout do <type_traits>.(N2342 przerobione wiele sformułowanie języka podstawowego, ale żadnych zmian kompilatora są niezbędne). Cechy te typu były dostępne w Visual C++ 2010, ale po prostu kopiowane is_pod.W związku z tym tabela wcześniej w tym dokumencie powiedział "No" pomocy technicznej.W Visual C++ w programie Visual Studio 2012, są one zasilane przez haki kompilatora, które mają na celu dokładne odpowiedzi.

Hh567368.collapse_all(pl-pl,VS.110).gifoverride i final

Prowadzący to krótkie, ale skomplikowane ewolucji.Początkowo, w wersji 0,8, było [override]], [hiding]], a [base_check] atrybutów.Potem w wersji 0,9, atrybuty zostały zniesione i zastąpione kontekstowych słowa kluczowe.Wreszcie, w w wersji 1.0, zostały obniżone do "final" na temat klas, i "override"i"final" na temat funkcji.To sprawia, że rozszerzenie wstąpił bo Visual C++ 2010 już obsługiwane to "override" składni na temat funkcji, i miał semantykę racjonalnie zbliżone do tych w C ++ 11. "final"było również obsługiwane, ale pod inną pisownię"zamknięte".W Visual Studio 2012, standardowe sprawdzanie pisowni i semantyka "override"i"final" są w pełni obsługiwane.Aby uzyskać więcej informacji, zobacz override, specyfikator i final, specyfikator.

Hh567368.collapse_all(pl-pl,VS.110).gifOperacji atomowych i więcej

Operacji atomowych, Porównaj silne i wymiany, dwukierunkowy ogrodzenia, i zamówienia współzależność danych określić biblioteki standardowej maszyn, które są stosowane w Visual C++ w programie Visual Studio 2012.

Hh567368.collapse_all(pl-pl,VS.110).gifStandardowe funkcje biblioteki

Która obejmie języka podstawowego.Jeśli chodzi o C ++ 11 biblioteki standardowej, nie mamy dość Tabela funkcje, ale Visual C++ w programie Visual Studio 2012 wdrożenia, z dwoma wyjątkami.Po pierwsze, gdy funkcja biblioteki zależy od funkcji, których brakuje w kompilator, będziemy albo symulować to, czego wymaga — na przykład, będziemy symulować zmienne szablony dla make_shared<T>()— lub go nie wdrożymy — istnieje tylko w kilku przypadkach, w szczególności, <initializer_list>.Drugi, standardowa biblioteka C99, która jest włączona w odniesieniu do C ++ 11 standardowa biblioteka jest w większości niezaimplementowany, mimo że <stdint.h> został zaimplementowany w Visual C++ 2010.Oto częściowa lista zmian w Visual C++ w programie Visual Studio 2012:

Nowe nagłówki:<atomic>, <chrono>, <condition_variable>, <future>, <mutex>, <ratio>, <scoped_allocator>, i <thread>.

Umieszczanie: zgodnie z wymogami C ++ 11, emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() są implementowane w wszystkie pojemniki na "dowolnego" liczby argumentów (zobacz sekcję "Faux variadics").Na przykład vector<T> ma "template <typename... Args> void emplace_back(Args&&... args)" który bezpośrednio konstrukcje elementu typu T z tyłu nosicieli z dowolnej liczby argumentów dowolnego, doskonale przesyłane dalej.Może to być bardziej efektywne niż push_back(T&&), która obejmowałaby konstrukcji dodatkowy ruch i zniszczenia.

**Faux variadics:**Visual C++ w programie Visual Studio 2012 ma nowy schemat symulowanie zmienne szablony. W Visual C++ 2008 z dodatkiem SP1 i Visual C++ 2010, subheaders były wielokrotnie zawarte z makrami zdefiniowane inaczej za każdym razem, aby pieczęć się przeciążeń na 0, 1, 2, 3 lub więcej argumentów.Na przykład <memory> uwzględnione wewnętrznego nagłówka <xxshared> , aby pieczęć się make_shared<T>(args, args, args).W Visual C++ w programie Visual Studio 2012, subheaders zostaną usunięte.Teraz zmienne szablony, same są zdefiniowane jako makr (za dużo kontynuacji odwróconej kreski ułamkowej) i następnie rozszerzony przy użyciu makr wzorca.Zmiana ta implementacja wewnętrzna ma następujące skutki:

  • Kod jest bardziej utrzymaniu, łatwiejszy w użyciu, (dodanie, subheaders było sporo pracy) i bardziej czytelny.

  • Trudniej krocz z debugera jest — Niestety!

  • pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) Konstruktor std::pair miał "interesujące" efekty.Wymaga to N ^ 2 overloads (Jeśli możemy obsłużyć do 10-krotek, która oznacza 121 przeciążenia, ponieważ puste krotek, w tym miejscu policzyć zbyt).

Spam się tyle overloads krotka pary, a także wszystkie przeciążenia umieszczanie zużywane ogromną ilość pamięci podczas kompilacji.W związku z tym zmniejszyliśmy nieskończoności.W Visual C++ 2008 z dodatkiem SP1 i Visual C++ 2010, nieskończoności było 10 (to znaczy "zmienne" Szablony obsługiwane argumenty 0-10 włącznie).Domyślnie nieskończoności jest 5 w Visual C++ w programie Visual Studio 2012.Wybranie tej opcji powoduje zużycie pamięci kompilator powrót do takiego, jaki był poprzednio w Visual C++ 2010.Jeśli potrzebujesz więcej argumentów (na przykład, jeśli masz istniejący kod, który używa krotek 6), istnieje kreskowania escape.Można zdefiniować _VARIADIC_MAX całego projektu od 5 do 10 włącznie.To zużywa więcej pamięci i może wymagają użycia /Zm opcję kompilatora, aby zarezerwować więcej miejsca dla skompilowane nagłówków.

**Losowości:**uniform_int_distribution jest teraz doskonale bezstronna, i shuffle() jest zaimplementowana w <algorithm>, który bezpośrednio akceptuje jednolitego liczb losowych, jak mersenne_twister.

Odporność na operatorów przeciążone o adres: C ++ 98/03 zabrania przeciążanie operatora w jego adres z elementem kontenerem STL.Jest to, co klasy jak CComPtr robi tak, że Pomocnik klas takich jak CAdapt byli zobowiązani do tarczy STL z takich przeciążenia.W trakcie opracowywania Visual C++ 2010, STL wprowadzone zmiany to Odrzuć przeciążony adres z podmiotów gospodarczych w sytuacjach nawet więcej.C ++ 11 zmienionych wymagań, aby operatorzy przeciążone z adresu do przyjęcia.C ++ 11, i Visual C++ 2010, zapewnia funkcja helper std::addressof(), który można uzyskać prawdziwy adres obiektu, niezależnie od tego, przeciążanie operatora.Przed Visual C++ 2010 został zwolniony, staraliśmy się zastąpić wystąpienia "&elem"z"std::addressof(elem)", która jest odpowiednio odpornych.W Visual C++ w programie Visual Studio 2012, posunęliśmy się dalej.Teraz możemy już audytowi wszystkich kontenerów i wszystkie Iteratory, tak aby klas, które przeciążyć operatora adres z może być używany przez cały STL.

Visual C++ w programie Visual Studio 2012wykracza poza C ++ 11 na kilka sposobów:

Iteratory PRZERAŻAJĄCE: w sposób dozwolony, ale nie jest wymagane przez C ++ 11 norma, Iteratory PRZERAŻAJĄCE zostały wdrożone, zgodnie z opisem N2911 "Minimalizacji zależności w obrębie rodzajowy klas dla szybciej i mniejsze programy" i N2980 "PRZERAŻAJĄCE przypisania sterująca i inicjowania, rewizja 1".

System plików:<filesystem> nagłówek od wniosek TR2 został dodany.Oferuje on recursive_directory_iterator i innych interesujących funkcjach.Zanim prace nad TR2 zostały zamrożone, ponieważ C ++ 0 x został uruchomiony bardzo późno i zmieniała się na C ++ 11, propozycja 2006 został uzyskany z Boost.Filesystem w wersji 2.To przekształciła się w Boost.Filesystem V3, ale nie jest zaimplementowana w Visual C++ w programie Visual Studio 2012.

I optymalizacja głównych!Wszystkie nasze kontenery teraz są optymalnie małych, biorąc pod uwagę ich bieżącej oświadczenia.Dotyczy to obiektów kontenera, nie do ich zawartości wskazywanego.Na przykład std::vector zawiera trzy surowych wskaźników.W Visual C++ 2010, x 86 wydania tryb, std::vector był 16 bajtów.W Visual C++ w programie Visual Studio 2012, to 12 bajtów, który jest optymalnie mały.Jest to wielka sprawa — Jeśli masz wektory 100 000 w programie, Visual C++ w programie Visual Studio 2012 zapisać 400 000 bajtów.Wykorzystanie pamięci zmniejszenie zapisuje przestrzeni i czasie.

Cel ten został osiągnięty poprzez unikanie przechowywania pustych allocators i komparatorów, ponieważ std::allocator i std::less są bezstanowe.(Optymalizacje te są włączone dla niestandardowych allocators/komparatorów, tak długo, jak są one bezstanowym.Oczywiście nie można uniknąć przechowywania stanowe allocators/komparatorów, ale te są bardzo rzadko.)

Hh567368.collapse_all(pl-pl,VS.110).gifRozmiary kontenera

W poniższych tabelach przedstawiono rozmiary kontenera, w bajtach dla platform x 86 i x 64.(ARM 32-bitowych jest równoważne x 86 do tych celów).Te tabele obejmują trybie release, ponieważ tryb debugowania zawiera kontroli maszyn, który zużywa przestrzeni i czasie.Są osobnymi kolumnami dla Visual C++ 2008 z dodatkiem SP1, gdzie _SECURE_SCL ustawiana domyślnie na wartość 1, a dla Visual C++ 2008 z dodatkiem SP1 z _SECURE_SCL ręcznie ustawiona na 0 dla maksymalnej prędkości.Visual C++ 2010and Visual C++ w programie Visual Studio 2012 default _SECURE_SCL to 0 (now known as _ITERATOR_DEBUG_LEVEL).

x 86 rozmiary kontenera (bajty)

VC9 Z DODATKIEM SP1

VC9 Z DODATKIEM SP1

SCL = 0

VC10

VC11

Wektor <int>

24

16

16

12

Tablica < int 5 >

20

20

20

20

deque <int>

32

32

24

20

forward_list <int>

Nie dotyczy

Nie dotyczy

8

4

Lista <int>

28

12

12

8

priority_queue <int>

28

20

20

16

Kolejka <int>

32

32

24

20

stos <int>

32

32

24

20

pary < int, int >

8

8

8

8

Krotka < int, int, int >

16

16

16

12

Mapa < int, int >

32

12

16

8

Mapa wielokrotnego dopasowania < int, int >

32

12

16

8

zestaw <int>

32

12

16

8

Zestaw wielokrotny <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 rozmiary kontenera (bajty)

VC9 Z DODATKIEM SP1

VC9 Z DODATKIEM SP1

SCL = 0

VC10

VC11

Wektor <int>

48

32

32

24

Tablica < int 5 >

20

20

20

20

deque <int>

64

64

48

40

forward_list <int>

Nie dotyczy

Nie dotyczy

16

8

Lista <int>

56

24

24

16

priority_queue <int>

56

40

40

32

Kolejka <int>

64

64

48

40

stos <int>

64

64

48

40

pary < int, int >

8

8

8

8

Krotka < int, int, int >

16

16

16

12

Mapa < int, int >

64

24

32

16

Mapa wielokrotnego dopasowania < int, int >

64

24

32

16

zestaw <int>

64

24

32

16

Zestaw wielokrotny <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

Skrócona instrukcja obsługi do Visual C++ w wersji liczb

Visual C++ jest różnych "numery wersji", w zależności od tego, gdzie szukać.Istnieje wersja marką (wydrukowany na pudełku), wewnętrzny wersja (wyświetlane w o okno dialogowe), a wersja kompilatora (wyświetlane przez cl.exe i _MSC_VER makro).

Numer wersji markowe

Wewnętrzny numer wersji

#define _MSC_VERnumer wersji

Visual C++ 2005

VC8

1400

Visual C++ 2008

VC9

1500

Visual C++ 2010

VC10

1600

Visual C++ w programie Visual Studio 2012

VC11

1700

_MSC_VER Makro jest interesować osoby docelowa różne wersje główne, z Visual C++ i emitują inny kod dla nich.

Zobacz też

Informacje

Lambda wyrażenia w języku C++

Range-based for — instrukcja (C++)

Inne zasoby

Nowoczesne C++ Programming Guide

Skorowidz języka C++

Biblioteka języka C++ wzorcowego

Visual C++ przez zespół