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.
VC10 |
VC11 |
|
---|---|---|
Referencję v0.1, wersja 1.0, v2.0, v2.1, v3.0 |
wersja 2.0 |
v2.1* |
Nie |
Nie |
|
Nie |
Nie |
|
Zmienne szablony v0.9, wersja 1.0 |
Nie |
Nie |
Nie |
Nie |
|
Tak |
Tak |
|
Auto v0.9, wersja 1.0 |
Wersja 1.0 |
Wersja 1.0 |
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* * |
Tak |
Tak |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Nie |
|
Tak |
Tak |
|
Tak |
Tak |
|
Częściowe |
Tak |
|
Nie |
Tak |
|
Nie |
Nie |
|
Nie |
Nie |
|
TR1 |
Częściowe |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Tak |
|
Nie |
Nie |
|
Tak |
Tak |
|
Nie |
Nie |
|
Nie |
Nie |
|
Nie |
Nie |
|
Tak |
Tak |
|
Nie |
Tak |
|
override i final v0.8, v0.9, wersja 1.0 |
Częściowe |
Tak |
Tak |
Tak |
|
Nie |
Nie |
C ++ 11 podstawowe funkcje językowe: współbieżności |
VC10 |
VC11 |
---|---|---|
Nie dotyczy |
Nie dotyczy |
|
Nie |
Tak |
|
Nie |
Tak |
|
Nie |
Tak |
|
Nie dotyczy |
Nie dotyczy |
|
Nie |
Tak |
|
Nie |
Nie |
|
Tak |
Tak |
|
Nie |
Nie |
|
Nie |
Nie |
|
Częściowe |
Częściowe |
|
Nie |
Nie |
C ++ 11 podstawowe funkcje językowe: C99 |
VC10 |
VC11 |
---|---|---|
Częściowe |
Częściowe |
|
Częściowe |
Częściowe |
|
Tak |
Tak |
|
Nie dotyczy |
Nie dotyczy |
Oto krótki przewodnik informacje w tabelach.
R-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.
Przestroga |
---|
V0.1, wersja 1.0, 2.0, wersja 2.1, nazw v3.0 są własna, dla jasności i pokazanie rozwoju C ++ 11. |
Lambdas
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.)
decltype
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.
Zdecydowanie 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.
Wyró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.
Ukł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.
override 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.
Operacji 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.
Standardowe 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.)
Rozmiary 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
Range-based for — instrukcja (C++)
Inne zasoby
Nowoczesne C++ Programming Guide