Udostępnij za pośrednictwem


Co nowego w języku C++ w programie Visual Studio 2017

Program Visual Studio 2017 oferuje wiele aktualizacji i poprawek środowiska C++. Rozwiązaliśmy ponad 250 usterek i zgłaszaliśmy problemy w kompilatorze i narzędziach. Wiele z nich zostało przesłanych przez klientów za pośrednictwem opcji Zgłoś problem i Podaj sugestię w obszarze Wyślij opinię. Dziękujemy za zgłaszanie usterek!

Aby uzyskać więcej informacji na temat nowości we wszystkich programach Visual Studio, zobacz Co nowego w programie Visual Studio 2017. Aby uzyskać informacje na temat nowości w języku C++ w programie Visual Studio 2019, zobacz Co nowego w języku C++ w programie Visual Studio 2019. Aby uzyskać informacje na temat nowości w języku C++ w programie Visual Studio 2015 i starszych wersjach, zobacz Visual C++ What's New 2003–2015 (Co nowego w programie Visual C++ do 2015). Aby uzyskać informacje o nowościach w dokumentacji języka C++, zobacz Microsoft C++ docs: What's new (Dokumentacja języka Microsoft C++: co nowego).

Kompilator języka C++ programu Visual Studio 2017

Ulepszenia zgodności języka C++

Zaktualizowaliśmy kompilator języka C++ i bibliotekę standardową w tej wersji z rozszerzoną obsługą funkcji C++11 i C++14. Obejmuje również wstępną obsługę niektórych funkcji, które powinny znajdować się w standardzie C++17. Aby uzyskać szczegółowe informacje, zobacz Ulepszenia zgodności języka C++ w programie Visual Studio 2017.

Visual Studio 2017, wersja 15.5

Kompilator obsługuje około 75% funkcji, które są nowe w języku C++17, w tym powiązania strukturalne, constexpr lambdy, zmienne wbudowane, if constexprwyrażenia złożone i dodawanie noexcept do systemu typów. Te funkcje są dostępne w /std:c++17 ramach opcji . Aby uzyskać więcej informacji, zobacz C++ Conformance Improvements in Visual Studio 2017 (Ulepszenia zgodności języka C++ w programie Visual Studio 2017)

Visual Studio 2017 w wersji 15.7

Zestaw narzędzi kompilatora MSVC w programie Visual Studio w wersji 15.7 jest teraz zgodny ze standardem C++. Aby uzyskać więcej informacji, zobacz Ogłoszenie: MSVC jest zgodne ze standardem C++ i zgodnością języka Microsoft C/C++.

Visual Studio 2017 w wersji 15.8

Przełącznik /experimental:preprocessor kompilatora umożliwia nowy eksperymentalny preprocesor MSVC, który ostatecznie będzie zgodny ze wszystkimi odpowiednimi standardami C i C++. Aby uzyskać więcej informacji, zobacz MSVC new preprocessor overview (Omówienie nowego preprocesora MSVC).

Nowe opcje kompilatora

Visual Studio 2017, wersja 15.3
  • /std:c++14 i /std:c++latest: Te opcje kompilatora umożliwiają wybranie określonych wersji języka programowania ISO C++ w projekcie. Większość nowych funkcji standardowych wersji roboczych jest chroniona /std:c++latest przez tę opcję.

  • /std:c++17 włącza zestaw funkcji języka C++17 implementowanych przez kompilator. Ta opcja wyłącza obsługę kompilatora i standardowej biblioteki dla funkcji po wersji C++17: te, które zostały zmienione lub nowe w nowszych wersjach roboczej wersji roboczej oraz aktualizacje wad standardu C++. Aby włączyć te funkcje, użyj polecenia /std:c++latest.

Codegen, zabezpieczenia, diagnostyka i przechowywanie wersji

W tej wersji wprowadzono kilka ulepszeń optymalizacji, generowania kodu, przechowywania wersji zestawu narzędzi i diagnostyki. Do istotnych ulepszeń należą:

Visual Studio 2017, wersja 15.3

Ulepszenia diagnostyki w kompilatorze. Aby uzyskać więcej informacji, zobacz Ulepszenia diagnostyczne w programie Visual Studio 2017 15.3.0.

Visual Studio 2017, wersja 15.5

Wydajność środowiska uruchomieniowego języka Visual C++ nadal poprawia się dzięki lepszej jakości wygenerowanego kodu. Teraz możesz po prostu ponownie skompilować kod, a aplikacja działa szybciej. Niektóre optymalizacje kompilatora są zupełnie nowe, takie jak wektoryzacja warunkowych magazynów skalarnych, połączenie wywołań sin(x) i cos(x) w nowe sincos(x), oraz eliminacja nadmiarowych instrukcji z optymalizatora SSA. Inne optymalizacje kompilatora to ulepszenia istniejących funkcji, takie jak: heurystyka wektoryzatora dla wyrażeń warunkowych, lepsza optymalizacja pętli i liczba zmiennoprzecinkowa minimalna/maksymalna liczba kodów. Konsolidator ma nową i szybszą /OPT:ICF implementację, co może spowodować przyspieszenie do 9% czasu łączenia i istnieją inne poprawki wydajności w łączeniu przyrostowym. Aby uzyskać więcej informacji, zobacz /OPT (Optymalizacje) i /INCREMENTAL (Połącz przyrostowo).

Kompilator języka Microsoft C++ obsługuje oprogramowanie AVX-512 firmy Intel. Zawiera on instrukcje dotyczące długości wektora, które przenoszą nowe funkcje w rejestrach AVX-512 do 128-bitowych i 256-bitowych.

Opcja /Zc:noexceptTypes- może służyć do przywracania do wersji noexcept C++14 podczas korzystania z trybu C++17 w ogóle. Ta opcja umożliwia zaktualizowanie kodu źródłowego w taki sposób, aby był zgodny z językiem C++17 bez konieczności ponownego zapisywania całego throw() kodu w tym samym czasie. Aby uzyskać więcej informacji, zobacz Usuwanie specyfikacji wyjątków dynamicznych i brak wyjątku.

Visual Studio 2017 w wersji 15.7

Standardowa biblioteka C++

Ulepszenia poprawności

Visual Studio 2017 RTM (wersja 15.0)
  • Drobne basic_string _ITERATOR_DEBUG_LEVEL != 0 ulepszenia diagnostyki. Gdy sprawdzanie IDL zostanie potknięte w maszynach ciągowych, teraz zgłasza określone zachowanie, które spowodowało podróż. Na przykład zamiast "iterator ciągów nie można wyłuszczyć" otrzymujesz "nie można wyłuszczyć iteratora ciągów, ponieważ jest poza zakresem (np. iterator końca)".
  • std::promise Naprawiono operator przypisania przenoszenia, który wcześniej mógł spowodować zablokowanie kodu na zawsze.
  • Naprawiono błędy kompilatora z niejawną konwersją atomic<T*> na T*.
  • pointer_traits<Ptr>teraz poprawnie wykrywa .Ptr::rebind<U>
  • Naprawiono brak const kwalifikatora move_iterator w operatorze odejmowania.
  • Naprawiono dyskretne nieprawidłowe generowanie kodu dla alokatorów zdefiniowanych przez użytkownika stanowych żądań propagate_on_container_copy_assignment i propagate_on_container_move_assignment.
  • atomic<T> teraz toleruje przeciążone operator&().
  • Nieco ulepszona diagnostyka kompilatora pod kątem nieprawidłowych bind() wywołań.

W programie Visual Studio 2017 RTM wprowadzono więcej standardowych ulepszeń biblioteki. Aby uzyskać pełną listę, zobacz wpis w blogu zespołu języka C++ Standardowe poprawki biblioteki w programie VS 2017 RTM.

Visual Studio 2017, wersja 15.3
  • Standardowe kontenery biblioteki mają teraz zaciśnięte max_size() wartości , numeric_limits<difference_type>::max() a nie max() .size_type Ta zmiana gwarantuje, że wynik distance() iteratorów z tego kontenera jest reprezentowany w zwracanym typie distance().
  • Usunięto brakującą specjalizację auto_ptr<void>.
  • Algorytmy for_each_n(), generate_n()i search_n() wcześniej nie można skompilować, jeśli argument długości nie był typem całkowitym. Teraz próbują przekonwertować długości nieintegralne na iteratory . difference_type
  • normal_distribution<float> nie emituje już ostrzeżeń wewnątrz standardowej biblioteki o zawężaniu z podwójnego do zmiennoprzecinkowego.
  • Naprawiono niektóre basic_string operacje używane npos zamiast podczas sprawdzania maksymalnego max_size() przepełnienia rozmiaru.
  • condition_variable::wait_for(lock, relative_time, predicate) będzie czekać na cały względny czas, jeśli nie było fałszywe przebudzenie. Teraz czeka tylko jeden interwał czasu względnego.
  • future::get() teraz unieważnia element future, zgodnie z wymaganiami standardowymi.
  • iterator_traits<void *> używany jako twardy błąd, ponieważ próbował utworzyć void&; teraz staje się pustą strukturą umożliwiającą użycie iterator_traits w warunkach SFINAE "is iterator".
  • Niektóre ostrzeżenia zgłoszone przez język Clang -Wsystem-headers zostały naprawione.
  • Naprawiono również "specyfikacja wyjątku w deklaracji nie jest zgodna z poprzednią deklaracją" zgłoszoną przez Clang -Wmicrosoft-exception-spec.
  • Naprawiono również ostrzeżenia dotyczące porządkowania list mem-initializer zgłaszane przez język Clang i C1XX.
  • Kontenery nieurządkowane nie zamieniły funkcji skrótu ani predykatów, gdy same kontenery zostały zamienione. Teraz to robią.
  • Wiele operacji zamiany kontenerów jest teraz oznaczonych noexcept (ponieważ nasza biblioteka standardowa nigdy nie zamierza zgłaszać wyjątku podczas wykrywaniapropagate_on_container_swap niezdefiniowanego warunku zachowania niezdefiniowanego alokatora).
  • Wiele vector<bool> operacji jest teraz oznaczonych jako noexcept.
  • Biblioteka standardowa wymusza teraz dopasowywanie alokatora value_type (w trybie C++17) z wykluciem ucieczki rezygnacji.
  • Usunięto niektóre warunki, w których samodzielne wstawianie zakresu do basic_string elementu powodowało przecięcie zawartości ciągów. (Uwaga: samozakresowe wstawianie do wektorów jest nadal zabronione przez standard).
  • basic_string::shrink_to_fit() nie ma już wpływu na alokatora propagate_on_container_swap.
  • std::decay Teraz obsługuje obrzydliwujące typy funkcji, czyli typy funkcji, które są kwalifikowane cv, ref-qualified lub oba typy.
  • Zmieniono dyrektywy dołączania, aby używać odpowiedniej poufności wielkości liter i ukośników, zwiększając przenośność.
  • Naprawiono ostrzeżenie C4061 "moduł wyliczający "enumerator" w przełączniku wyliczenia "wyliczenie" nie jest jawnie obsługiwane przez etykietę wielkości liter". To ostrzeżenie jest domyślnie wyłączone i zostało naprawione jako wyjątek od ogólnych zasad biblioteki standardowej dla ostrzeżeń. (Standardowa biblioteka jest /W4 czysta, ale nie próbuje być /Wall czysta. Wiele ostrzeżeń poza domyślnymi jest niezwykle hałaśliwych i nie jest przeznaczonych do regularnego użycia.
  • Ulepszone std::list kontrole debugowania. Lista iteratorów teraz sprawdza operator->(), a list::unique() teraz oznacza iteratory jako unieważnione.
  • Naprawiono metaprogramowanie przy użyciu alokatora w programie tuple.
Visual Studio 2017, wersja 15.5
  • std::partition teraz wywołuje predykat N razy zamiast razy, zgodnie z N + 1 wymaganiami standardu.
  • Próby uniknięcia magicznych statycznych w wersji 15.3 są naprawiane w wersji 15.5.
  • std::atomic<T> nie wymaga T już konstrukcji domyślnej.
  • Algorytmy sterty, które zajmują czas logarytmicznych zachowują się inaczej, gdy jest włączone debugowanie iteratora. Nie wykonują już liniowej asercji czasowej, że dane wejściowe są w rzeczywistości stertą.
  • __declspec(allocator) Funkcja jest teraz chroniona tylko dla języka C1XX, aby zapobiec ostrzeżeniom języka Clang, co nie rozumie tego declspec.
  • basic_string::npos jest teraz dostępny jako stała czasu kompilacji.
  • std::allocator W trybie C++17 teraz prawidłowo obsługuje alokację typów wyrównanych, czyli typów, których wyrównanie jest większe niż max_align_t, chyba że jest wyłączone przez /Zc:alignedNew-. Na przykład wektory obiektów z wyrównaniem 16 bajtów lub 32 bajtów są teraz prawidłowo wyrównane dla instrukcji SSE i AVX.

Ulepszenia zgodności

  • Dodaliśmy <wszystkie>, <string_view>, apply(), make_from_tuple().
  • Dodano <opcjonalne>, <warianty>, shared_ptr::weak_typei <cstdalign>.
  • Włączono język C++14 constexpr w systemach min(initializer_list), max(initializer_list)i minmax(initializer_list)i min_element(), max_element()i minmax_element().

Aby uzyskać więcej informacji, zobacz Zgodność języka Microsoft C/C++.

Visual Studio 2017, wersja 15.3
  • Zaimplementowano kilka innych funkcji języka C++17. Aby uzyskać więcej informacji, zobacz Tabela zgodności języka Microsoft C++.
  • Zaimplementowano P0602R0 "wariant i opcjonalny powinny propagować trywialię kopiowania/przenoszenia".
  • Biblioteka standardowa obecnie oficjalnie tolerowa dynamiczne RTTI jest wyłączona za pośrednictwem /GR- opcji. Zarówno, dynamic_pointer_cast() jak i rethrow_if_nested() z założenia wymagają dynamic_cast, więc biblioteka standardowa oznacza je teraz jako =delete w obszarze /GR-.
  • Nawet w przypadku wyłączenia dynamicznego języka RTTI za pośrednictwem /GR-polecenia "statyczny RTTI" w postaci typeid(SomeType) elementu jest nadal dostępny i obsługuje kilka standardowych składników biblioteki. Biblioteka standardowa obsługuje teraz również wyłączenie tej funkcji za pośrednictwem polecenia /D_HAS_STATIC_RTTI=0. Ta flaga wyłącza std::anyrównież funkcje std::functionelementów target() członkowskich i target_type() i funkcji get_deleter() elementów członkowskich oraz funkcji elementu członkowskiego znajomego i std::shared_ptr std::weak_ptr.
  • Biblioteka standardowa używa teraz bezwarunkowo języka C++14 constexpr zamiast warunkowo zdefiniowanych makr.
  • Biblioteka standardowa używa teraz szablonów aliasów wewnętrznie.
  • Standardowa biblioteka używa nullptr teraz wewnętrznie, a nie nullptr_t{}. (Wewnętrzne użycie wartości NULL zostało wyeliminowane. Wewnętrzne użycie wartości 0 jako null jest stopniowo czyszczone).
  • Standardowa biblioteka używa std::move() teraz wewnętrznie, zamiast stylistycznie błędnie używać std::forward().
  • Zmieniono static_assert(false, "message") na #error message. Ta zmiana poprawia diagnostykę kompilatora, ponieważ #error natychmiast zatrzymuje kompilację.
  • Biblioteka standardowa nie oznacza już funkcji jako __declspec(dllimport). Nowoczesna technologia konsolidatora nie wymaga już tej technologii.
  • Wyodrębniono argumenty SFINAE do domyślnych argumentów szablonu, które zmniejszyły bałagan w porównaniu z typami zwracanych i typami argumentów funkcji.
  • Testy debugowania w <losowych> teraz używają zwykłych maszyn biblioteki standardowej zamiast funkcji _Rng_abort()wewnętrznej , która została wywołana fputs() do stderr. Implementacja tej funkcji jest zachowywana pod kątem zgodności binarnej. Usuniemy go w następnej niezgodnej wersji binarnej standardowej biblioteki.
Visual Studio 2017, wersja 15.5
  • Dodano kilka standardowych funkcji biblioteki, przestarzałych lub usuniętych zgodnie ze standardem C++17. Aby uzyskać więcej informacji, zobacz Ulepszenia zgodności języka C++ w programie Visual Studio.
  • Eksperymentalna obsługa następujących algorytmów równoległych:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • Podpisy dla następujących algorytmów równoległych są dodawane, ale nie są w tej chwili zrównane. Profilowanie nie wykazało korzyści w algorytmach równoległych, które przenoszą tylko elementy permute:
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017, wersja 15.6
  • <memory_resource>
  • Podstawy biblioteki w wersji 1
  • polymorphic_allocator Usuwanie przypisania
  • Ulepszanie odliczenia argumentu szablonu klasy
Visual Studio 2017 w wersji 15.7
  • Obsługa algorytmów równoległych nie jest już eksperymentalna
  • Nowa implementacja <filesystem>
  • Konwersje ciągów podstawowych (częściowe)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • Unikanie niepotrzebnego rozpadu
  • Matematyczne funkcje specjalne
  • constexpr char_traits
  • Przewodniki dotyczące potrąceń dla standardowej biblioteki

Aby uzyskać więcej informacji, zobacz Zgodność języka Microsoft C/C++.

Poprawki wydajności i przepływności

  • Wykonane basic_string::find(char) przeciążenia są wywoływane traits::find tylko raz. Wcześniej został zaimplementowany jako ogólny ciąg wyszukiwania ciągu o długości 1.
  • basic_string::operator== Teraz sprawdza rozmiar ciągu przed porównaniem zawartości ciągów.
  • Usunięto sprzężenie sterowania w elemecie basic_string, co było trudne do przeanalizowania przez optymalizator kompilatora. W przypadku wszystkich krótkich ciągów wywoływanie reserve nadal ma koszt niezerowy, aby nic nie robić.
  • std::vector został poprawiony pod kątem poprawności i wydajności: aliasy podczas operacji wstawiania i miejsca są teraz poprawnie obsługiwane zgodnie z wymaganiami standardu, gwarancja silnego wyjątku jest teraz zapewniana w razie potrzeby przez standard za pośrednictwem move_if_noexcept() i innej logiki, a wstawianie i miejsce wykonuje mniej operacji elementów.
  • Standardowa biblioteka języka C++ pozwala teraz uniknąć wyłusania wskaźników o wartości null.
  • Zwiększona weak_ptr::lock() wydajność.
  • Aby zwiększyć przepływność kompilatora, nagłówki standardowej biblioteki języka C++ unikają teraz dołączania deklaracji do niepotrzebnych funkcji wewnętrznych kompilatora.
  • Zwiększono wydajność std::string i std::wstring przenieś konstruktory o ponad trzy razy.
Visual Studio 2017, wersja 15.3
  • Współpracowaliśmy nad interakcjami z noexceptprogramem , które uniemożliwiły wprowadzenie std::atomic implementacji do funkcji korzystających z obsługi wyjątków strukturalnych (SEH).
  • Zmieniono funkcję wewnętrzną _Deallocate() biblioteki standardowej, aby zoptymalizować ją na mniejszy kod, co pozwala na dodanie ich do większej liczby miejsc.
  • Zmieniono std::try_lock() polecenie , aby używać rozszerzenia pakietu zamiast rekursji.
  • Ulepszono std::lock() algorytm unikania zakleszczenia, aby używać lock() operacji zamiast obracać się na try_lock() wszystkich blokadach.
  • Włączono optymalizację nazwanej wartości zwracanej w programie system_category::message().
  • conjunction a disjunction teraz tworzy N + 1 wystąpienie typów zamiast 2N + 2 typów.
  • std::function nie tworzy już wystąpienia maszyn alokatora dla każdego wywołania wymazanego typu, zwiększając przepływność i zmniejszając .obj rozmiar w programach, które przekazują wiele odrębnych lambd do std::function.
  • allocator_traits<std::allocator> Zawiera operacje wbudowane std::allocator ręcznie, zmniejszając rozmiar kodu w kodzie, który wchodzi w interakcję std::allocator tylko za pośrednictwem allocator_traits (czyli w większości kodu).
  • Minimalny interfejs alokatora języka C++11 jest teraz obsługiwany przez standardową bibliotekę wywołującą allocator_traits bezpośrednio, zamiast opakowującego alokator w klasie _Wrap_allocwewnętrznej . Ta zmiana zmniejsza rozmiar kodu generowany na potrzeby obsługi alokatora, poprawia zdolność optymalizatora do wnioskowania o standardowych kontenerach biblioteki w niektórych przypadkach i zapewnia lepsze środowisko debugowania (jak teraz widzisz typ alokatora, a nie _Wrap_alloc<your_allocator_type> w debugerze).
  • Usunięto metaprogramowanie dla dostosowanego allocator::referenceelementu , które alokatory nie mogą być dostosowywane. (Alokatory mogą używać fantazyjne wskaźniki, ale nie fantazyjne odwołania).
  • Fronton kompilatora został nauczony odpakowania iteratorów debugowania w pętli opartych na zakresie, co poprawia wydajność kompilacji debugowania.
  • Wewnętrzna basic_string ścieżka zmniejszania elementu shrink_to_fit() i reserve() nie znajduje się już w ścieżce operacji przydziału, zmniejszając rozmiar kodu dla wszystkich zmutujących elementów członkowskich.
  • Wewnętrzna basic_string ścieżka wzrostu nie znajduje się już w ścieżce .shrink_to_fit()
  • Operacje basic_string mutowania są teraz uwzględniane w nieprzydzieleniu szybkiej ścieżki i przydzielaniu funkcji powolnej ścieżki, co sprawia, że jest bardziej prawdopodobne, aby wspólny przypadek bez przydziału był dołączany do wywołujących.
  • Operacjemutowania basic_string teraz konstruują ponownie przydział w preferowanym stanie, a nie zmianę rozmiaru. Na przykład wstawianie na początku ciągu przenosi teraz zawartość po wstawieniu dokładnie raz. Jest on przenoszony w dół lub do nowo przydzielonego buforu. Nie jest już przenoszony dwa razy w przypadku przydziału rzeczywistego, najpierw do nowo przydzielonego buforu, a następnie w dół.
  • Operacje wywołujące bibliotekę standardową języka C w <ciągu> buforują teraz adres w errno celu usunięcia powtarzającej się interakcji z protokołem TLS.
  • Uproszczono implementację is_pointer .
  • Zakończono zmianę wyrażenia opartego na funkcjach SFINAE na struct i void_toparte na .
  • Algorytmy biblioteki standardowej unikają teraz postinkrementacji iteratorów.
  • Naprawiono ostrzeżenia o obcięciu w przypadku używania 32-bitowych alokatorów w systemach 64-bitowych.
  • std::vector Przypisanie przenoszenia jest teraz bardziej wydajne w przypadku nieprzydzielenia alokatora innego niż POCMA, ponownie używając buforu, gdy jest to możliwe.
Visual Studio 2017, wersja 15.5
  • basic_string<char16_t> teraz angażuje się w te same memcmpoptymalizacje , memcpyi podobne, które basic_string<wchar_t> angażują się.
  • Ograniczenie optymalizatora, które uniemożliwiło tworzenie wbudowanych wskaźników funkcji, uwidocznione przez naszą pracę "unikanie kopiowania funkcji" w programie Visual Studio 2015 Update 3, zostało przepracowane, przywracając wydajność lower_bound(iter, iter, function pointer)programu .
  • Obciążenie związane z weryfikacją kolejności operacji iteratora w zakresie danych wejściowych do includes, set_symmetric_differenceset_difference, i set_union zostało zmniejszone przez odpisanie iteratorów przed sprawdzeniem kolejności.
  • std::inplace_merge teraz pomija elementy, które są już w pozycji.
  • Konstruowanie nie jest już konstruowane std::random_device , a następnie niszczy std::stringelement .
  • std::equal i std::partition miał przepustkę optymalizacji skoków, która zapisuje porównanie iteratora.
  • Po std::reverse przekazaniu wskaźników do trywialnie możliwego do skopiowania Telement jest teraz wysyłany do implementacji wektoryzowanej odręcznie.
  • std::fill, std::equali std::lexicographical_compare zostały nauczone, jak wysyłać do memset i i gsl::byte memcmp std::byte (i inne wyliczenia podobne do char i klasy wyliczenia). Ponieważ std::copy wysyła przy użyciu metody is_trivially_copyable, nie wymagał żadnych zmian.
  • Biblioteka standardowa nie zawiera już destruktorów pustych nawiasów klamrowych, których jedynym zachowaniem było uczynienie typów niestrukturalnymi.

Inne biblioteki

Obsługa bibliotek typu open source

Vcpkg to narzędzie wiersza polecenia typu open source, które znacznie upraszcza proces uzyskiwania i kompilowania bibliotek statycznych języka C++ typu open source i bibliotek DLL W programie Visual Studio. Aby uzyskać więcej informacji, zobacz vcpkg.

Zestaw CPPRest SDK 2.9.0

Visual Studio 2017, wersja 15.5

Zestaw CPPRestSDK, międzyplatformowy internetowy interfejs API dla języka C++, został zaktualizowany do wersji 2.9.0. Aby uzyskać więcej informacji, zobacz CppRestSDK 2.9.0 jest dostępny w witrynie GitHub.

ATL

Visual Studio 2017, wersja 15.5
  • Kolejny zestaw poprawek zgodności z wyszukiwaniem nazw
  • Istniejące konstruktory przenoszenia i operatory przypisania przenoszenia są teraz prawidłowo oznaczone jako niewzrastające
  • Nieskompresowane prawidłowe ostrzeżenie C4640 o bezpiecznym wątku init lokalnych statycznych w atlstr.h
  • Bezpieczne wątkowo inicjowanie lokalnych statycznych zostało automatycznie wyłączone w zestawie narzędzi XP podczas korzystania z ATL do kompilowania biblioteki DLL. Teraz tak nie jest. Jeśli nie chcesz inicjować bezpieczne wątkowo, możesz dodać /Zc:threadSafeInit- ustawienia projektu.

Środowisko uruchomieniowe Visual C++

  • Nowy nagłówek "cfguard.h" dla symboli funkcji Control Flow Guard.

Visual Studio 2017 C++ IDE

  • Wydajność wprowadzania zmian w konfiguracji jest teraz lepsza w przypadku natywnych projektów w języku C++ i o wiele lepsza w projektach C++/CLI. Gdy konfiguracja rozwiązania jest aktywowana po raz pierwszy, jest szybsza, a wszystkie późniejsze aktywacje tej konfiguracji rozwiązania są niemal natychmiastowe.
Visual Studio 2017, wersja 15.3
  • Ponownie napisano kilka kreatorów projektu i kodów w stylu okna dialogowego podpisu.
  • Polecenie Dodaj klasę uruchamia teraz kreatora Dodaj klasę bezpośrednio. Wszystkie inne elementy, które wcześniej znajdowały się w tym miejscu, są teraz dostępne w obszarze Dodaj > nowy element.
  • Projekty Win32 znajdują się teraz w kategorii Pulpit systemu Windows w oknie dialogowym Nowy projekt .
  • Szablony konsoli systemu Windows i aplikacji klasycznej teraz tworzą projekty bez wyświetlania kreatora. W tej samej kategorii znajduje się nowy Kreator pulpitu systemu Windows, który wyświetla te same opcje co stary kreator aplikacji konsolowej Win32.
Visual Studio 2017, wersja 15.5

Kilka operacji języka C++, które używają aparatu IntelliSense do refaktoryzacji i nawigacji po kodzie, są uruchamiane znacznie szybciej. Poniższe liczby są oparte na rozwiązaniu Visual Studio Chromium z 3500 projektami:

Funkcja Poprawa wydajności
Zmień nazwę 5,3x
Zmienianie podpisu 4,5x
Znajdź wszystkie odwołania 4,7x

Język C++ obsługuje teraz Ctrl+Click Go To Definition, dzięki czemu nawigacja myszą w definicjach jest łatwa. Wizualizator struktury z pakietu Productivity Power Tools jest teraz również domyślnie dołączony do produktu.

IntelliSense

  • Nowy aparat bazy danych oparty na SQLite jest teraz używany domyślnie. Nowy aparat przyspiesza operacje bazy danych, takie jak Przejdź do definicji i Znajdź wszystkie odwołania. Znacznie poprawia czas analizowania początkowego rozwiązania. Ustawienie przeniesiono do pozycji Narzędzia > Opcje > Edytor > tekstu C/C++ > Zaawansowane. (To było wcześniej pod ... Eksperymentalne C/C++ > )

  • Poprawiliśmy wydajność funkcji IntelliSense w projektach i plikach, które nie korzystają ze wstępnie skompilowanych nagłówków — w bieżącym pliku jest tworzony automatyczny prekompilowany nagłówek.

  • Do listy błędów dodaliśmy filtrowanie błędów i pomoc dotyczącą błędów funkcji IntelliSense. Kliknięcie kolumny błędów umożliwia teraz filtrowanie. Ponadto kliknięcie określonych błędów lub naciśnięcie F1 powoduje uruchomienie wyszukiwania w trybie online w poszukiwaniu komunikatu o błędzie.

    Lista błędów.

    Filtrowana lista błędów.

  • Dodano możliwość filtrowania listy elementów członkowskich według rodzaju.

    Filtrowanie listy elementów członkowskich.

  • Dodano nową eksperymentalną funkcję IntelliSense predykcyjną, która zapewnia kontekstowe filtrowanie elementów wyświetlanych na liście elementów członkowskich. Aby uzyskać więcej informacji, zobacz Ulepszenia funkcji IntelliSense języka C++ — predykcyjna funkcja IntelliSense i filtrowanie.

  • Funkcja Znajdź wszystkie odwołania (Shift+F12) ułatwia łatwe poruszanie się nawet w złożonych bazach kodu. Zapewnia zaawansowane grupowanie, filtrowanie, sortowanie, wyszukiwanie w wynikach oraz (w przypadku niektórych języków) kolorowanie, dzięki czemu można uzyskać jasne informacje na temat odwołań. W przypadku języka C++nowy interfejs użytkownika zawiera informacje o tym, czy odczytamy, czy zapisujemy w zmiennej.

  • Funkcja IntelliSense typu Kropka-strzałka została przeniesiona z eksperymentalnego do zaawansowanego i jest teraz domyślnie włączona. Funkcje edytora Rozwiń zakresy i Rozwiń pierwszeństwo zostały przeniesione z eksperymentalnego do zaawansowanego.

  • Eksperymentalne funkcje refaktoryzacji Change Signature i Extract Function są teraz domyślnie dostępne.

  • Dodano eksperymentalną funkcję "Szybsze ładowanie projektu" dla projektów języka C++. Przy następnym otwarciu projektu języka C++ będzie ładowany szybciej, a czas, po którym zostanie załadowany znacznie szybciej.

  • Niektóre z tych funkcji są wspólne dla innych języków, a niektóre są specyficzne dla języka C++. Aby uzyskać więcej informacji na temat tych nowych funkcji, zobacz Ogłoszenie programu Visual Studio "15" (wersja zapoznawcza 5).

Visual Studio 2017 w wersji 15.7

Projekty inne niż MSBuild z otwartym folderem

Program Visual Studio 2017 wprowadza funkcję Otwórz folder . Umożliwia ona kodowanie, kompilowanie i debugowanie w folderze zawierającym kod źródłowy bez konieczności tworzenia jakichkolwiek rozwiązań lub projektów. Teraz łatwiej jest rozpocząć pracę z programem Visual Studio, nawet jeśli projekt nie jest projektem opartym na programie MSBuild. Program Open Folder zapewnia dostęp do zaawansowanych funkcji rozumienia, edytowania, kompilowania i debugowania kodu. Są to te same, które program Visual Studio już udostępnia dla projektów MSBuild. Aby uzyskać więcej informacji, zobacz Otwieranie projektów folderów dla języka C++.

  • Ulepszenia obsługi polecenia Otwórz folder. Środowisko można dostosować za pomocą tych plików .json:
    • CppProperties.json dostosowuje obsługę funkcji IntelliSense i przeglądania.
    • Tasks.json dostosowuje kroki kompilacji.
    • Launch.json dostosowuje obsługę debugowania.
Visual Studio 2017, wersja 15.3

Obsługa narzędzia CMake za pośrednictwem funkcji Otwórz folder

Program Visual Studio 2017 wprowadza obsługę korzystania z projektów CMake bez konwertowania na pliki projektu MSBuild (.vcxproj). Aby uzyskać więcej informacji, zobacz Projekty CMake w programie Visual Studio. Otwieranie projektów CMake z funkcją Otwórz folder automatycznie konfiguruje środowisko do edycji, kompilowania i debugowania języka C++.

  • Funkcja IntelliSense języka C++ działa bez konieczności tworzenia pliku CppProperties.json w folderze głównym. Dodaliśmy nową listę rozwijaną, aby umożliwić użytkownikom łatwe przełączanie się między konfiguracjami udostępnianymi przez narzędzie CMake i pliki CppProperties.json.

  • Dalsza konfiguracja jest obsługiwana przy użyciu pliku CMakeSettings.json, który znajduje się w tym samym folderze co plik CMakeLists.txt.

    Otwórz folder CMake.

Visual Studio 2017, wersja 15.3
  • Dodano obsługę generatora CMake Ninja.
Visual Studio 2017, wersja 15.4
  • Dodano obsługę importowania istniejących pamięci podręcznych CMake.
Visual Studio 2017, wersja 15.5

Tworzenie aplikacji klasycznych systemu Windows

Zapewniamy obecnie bardziej zaawansowane środowisko instalacji oryginalnego obciążenia C++. Dodaliśmy możliwe do wyboru składniki, które umożliwiają zainstalowanie tylko potrzebnych narzędzi. Wskazane rozmiary instalacji składników wymienionych w interfejsie użytkownika instalatora są niepoprawne i nie doceniają całkowitego rozmiaru.

Aby pomyślnie tworzyć projekty Win32 w obciążeniu C++ dla komputerów stacjonarnych, musisz zainstalować zarówno zestaw narzędzi, jak i zestaw SDK systemu Windows. Zainstaluj zalecane (wybrane) składniki VC++ 2017 v141 toolset (x86, x64) i Windows 10 SDK (10.0.nnnnn), aby upewnić się, że działa. Jeśli niezbędne narzędzia nie zostaną zainstalowane, projekty nie zostaną utworzone pomyślnie, a kreator przestanie odpowiadać.

Visual Studio 2017, wersja 15.5

Narzędzia kompilacji Visual C++ (wcześniej dostępne jako produkt autonomiczny) są teraz dołączane jako obciążenie w Instalator programu Visual Studio. To obciążenie instaluje tylko narzędzia wymagane do kompilowania projektów C++ bez instalowania środowiska IDE programu Visual Studio. Dostępne są zarówno zestawy narzędzi v140, jak i v141. Zestaw narzędzi w wersji 141 zawiera najnowsze ulepszenia programu Visual Studio 2017 w wersji 15.5. Aby uzyskać więcej informacji, zobacz Visual Studio Build Tools now include the VS2017 and VS2015 MSVC Toolsets (Narzędzia Visual Studio Build Tools now include the VS2017 and VS2015 MSVC Toolset).

Programowanie dla systemu Linux w języku C++

Popularne rozszerzenie Visual C++ for Linux Development stanowi obecnie cześć programu Visual Studio. Ta instalacja zawiera wszystko, czego potrzebujesz do tworzenia i debugowania aplikacji w języku C++ działających w środowisku systemu Linux.

Program Visual Studio 2017 w wersji 15.2

Wprowadzono ulepszenia w zakresie współużytkowania kodu międzyplatformowego i wizualizacji typów. Aby uzyskać więcej informacji, zobacz Ulepszenia języka C++ dla systemu Linux dotyczące współużytkowania kodu międzyplatformowego i wizualizacji typów.

Visual Studio 2017, wersja 15.5
  • Obciążenie systemu Linux dodało obsługę rsync jako alternatywy dla sftp na potrzeby synchronizowania plików z zdalnymi maszynami z systemem Linux.
  • Dodano obsługę kompilowania krzyżowego przeznaczonego dla mikrokontrolerów arm. Aby włączyć ją w instalacji, wybierz pakiet roboczy Programowanie dla systemu Linux za pomocą języka C++ , a następnie wybierz opcję Embedded and IoT Development (Programowanie osadzone i IoT). Ta opcja dodaje narzędzia do kompilowania krzyżowego arm GCC i Make do instalacji. Aby uzyskać więcej informacji, zobacz ARM GCC Cross Compilation in Visual Studio (Kompilacja krzyżowa GCC usługi ARM w programie Visual Studio).
  • Dodano obsługę narzędzia CMake. Teraz możesz pracować nad istniejącą bazą kodu CMake bez konieczności konwertowania go na projekt programu Visual Studio. Aby uzyskać więcej informacji, zobacz Konfigurowanie projektu CMake systemu Linux.
  • Dodano obsługę uruchamiania zadań zdalnych. Ta funkcja umożliwia uruchamianie dowolnego polecenia w systemie zdalnym zdefiniowanym w Menedżer połączeń programu Visual Studio. Zadania zdalne zapewniają również możliwość kopiowania plików do systemu zdalnego. Aby uzyskać więcej informacji, zobacz Konfigurowanie projektu CMake systemu Linux.
Visual Studio 2017 w wersji 15.7

Programowanie gier w języku C++

Pełnych możliwości języka C++ można użyć do tworzenia profesjonalnych gier obsługiwanych przy użyciu zestawu funkcji DirectX lub Cocos2d.

Programowanie aplikacji mobilnych za pomocą języka C++ dla systemów Android i iOS

Program Visual Studio umożliwia obecnie programowanie i debugowanie aplikacji mobilnych przeznaczonych dla systemów Android oraz iOS.

Aplikacje uniwersalne systemu Windows

Język C++ stanowi składnik opcjonalny obciążenia Aplikacja uniwersalna systemu Windows. Obecnie należy ręcznie uaktualnić projekty języka C++. Możesz otworzyć projekt platforma uniwersalna systemu Windows przeznaczony dla wersji 140 w programie Visual Studio 2017. Należy jednak wybrać zestaw narzędzi platformy v141 na stronach właściwości projektu, jeśli nie masz zainstalowanego programu Visual Studio 2015.

Nowe opcje języka C++ na platformie platforma uniwersalna systemu Windows (UWP)

Masz teraz nowe opcje pisania i tworzenia pakietów aplikacji C++ dla platforma uniwersalna systemu Windows i Sklepu Windows: infrastruktura Mostek dla aplikacji klasycznych umożliwia spakowanie istniejącej aplikacji klasycznej lub obiektu COM do wdrożenia za pośrednictwem Sklepu Windows. Możesz też przeprowadzić wdrożenie za pośrednictwem istniejących kanałów za pośrednictwem ładowania bezpośredniego. Nowe możliwości w systemie Windows 10 umożliwiają dodawanie funkcji platformy UWP do aplikacji klasycznej na różne sposoby. Aby uzyskać więcej informacji, zobacz Mostek dla aplikacji klasycznych.

Visual Studio 2017, wersja 15.5

Dodano szablon projektu Projektu tworzenia pakietów aplikacji systemu Windows, który znacznie upraszcza tworzenie pakietów aplikacji klasycznych przy użyciu Mostek dla aplikacji klasycznych. Jest ona dostępna w obszarze Plik | Nowy | Projekt | Zainstalowane | Visual C++ | platforma uniwersalna systemu Windows. Aby uzyskać więcej informacji, zobacz Tworzenie pakietu aplikacji przy użyciu programu Visual Studio (Mostek dla aplikacji klasycznych).

Podczas pisania nowego kodu można teraz używać standardowego projekcji języka C++/WinRT dla środowisko wykonawcze systemu Windows zaimplementowanego wyłącznie w plikach nagłówkowych. Umożliwia korzystanie z interfejsów API środowisko wykonawcze systemu Windows i tworzenie ich przy użyciu dowolnego kompilatora C++ zgodnego ze standardami. Język C++/WinRT został zaprojektowany w celu zapewnienia deweloperom języka C++ pierwszego dostępu do nowoczesnego interfejsu API systemu Windows. Aby uzyskać więcej informacji, zobacz C++/WinRT.

Począwszy od kompilacji 17025 niejawnego programu Windows SDK Insider Preview, język C++/WinRT jest dołączony do zestawu Windows SDK. Aby uzyskać więcej informacji, zobacz C++/WinRT jest teraz dołączony do zestawu Windows SDK.

Zestaw narzędzi platformy Clang/C2

Zestaw narzędzi Clang/C2 dostarczany z programem Visual Studio 2017 obsługuje /bigobj teraz przełącznik, który ma kluczowe znaczenie dla tworzenia dużych projektów. Zawiera również kilka ważnych poprawek błędów, zarówno w frontonie kompilatora, jak i zapleczu.

Analiza kodu C++

Podstawowe narzędzia do sprawdzania kodu C++ wymuszające stosowanie podstawowych wytycznych dotyczących języka C++ są obecnie dystrybuowane z programem Visual Studio. Włącz narzędzia do sprawdzania na stronie Rozszerzenia analizy kodu na stronach właściwości projektu. Rozszerzenia są następnie uwzględniane podczas uruchamiania analizy kodu. Aby uzyskać więcej informacji, zobacz Using the C++ Core Guidelines checkers (Korzystanie z podstawowych wytycznych języka C++).

Zrzut ekranu przedstawiający okno dialogowe Strony właściwości konfiguracji z wybraną ogólną analizą > kodu właściwości > oraz kilka testów podstawowych wymienionych w sekcji Uruchom ten zestaw reguł.

Visual Studio 2017, wersja 15.3
  • Dodano obsługę reguł związanych z zarządzaniem zasobami.
Visual Studio 2017, wersja 15.5
  • Nowe podstawowe wytyczne języka C++ obejmują inteligentną poprawność wskaźnika, prawidłowe użycie globalnych inicjatorów i flagowanie zastosowań konstrukcji, takich jak goto i nieprawidłowe rzutowania.

  • Niektóre numery ostrzeżeń, które można znaleźć w wersji 15.3, nie są już dostępne w wersji 15.5. Ostrzeżenia te zostały zastąpione bardziej szczegółowymi operacjami sprawdzania.

Visual Studio 2017, wersja 15.6
Visual Studio 2017 w wersji 15.7
  • Dodano obsługę elementu /analyze:ruleset, która umożliwia określenie reguł analizy kodu do uruchomienia.
  • Dodano obsługę większej liczby reguł wytycznych podstawowych języka C++. Aby uzyskać więcej informacji, zobacz Using the C++ Core Guidelines checkers (Korzystanie z podstawowych wytycznych języka C++).

Testowanie jednostkowe w programie Visual Studio 2017

Visual Studio 2017, wersja 15.5

Adapter Google Test i Adapter Boost.Test są teraz dostępne jako składniki obciążenia Programowanie aplikacji klasycznych z językiem C++ . Są one zintegrowane z Eksploratorem testów. Dodano obsługę narzędzia CTest dla projektów CMake (przy użyciu funkcji Otwórz folder), chociaż pełna integracja z Eksploratorem testów nie jest jeszcze dostępna. Aby uzyskać więcej informacji, zobacz Pisanie testów jednostkowych dla języka C/C++.

Visual Studio 2017, wersja 15.6
  • Boost.Test Dodano obsługę biblioteki dynamicznej.
  • Szablon Boost.Test elementu jest teraz dostępny w środowisku IDE.

Aby uzyskać więcej informacji, zobacz Boost.Test Testowanie jednostkowe: obsługa biblioteki dynamicznej i Szablon nowego elementu.

Visual Studio 2017 w wersji 15.7

Dodano obsługę funkcji CodeLens dla projektów testów jednostkowych języka C++. Aby uzyskać więcej informacji, zobacz Ogłoszenie funkcji CodeLens na potrzeby testowania jednostkowego języka C++.

Diagnostyka grafiki programu Visual Studio

Narzędzia do diagnostyki grafiki programu Visual Studio: można ich używać do rejestrowania i analizowania problemów z renderowaniem i wydajnością w aplikacjach Direct3D. Używaj ich w aplikacjach uruchamianych lokalnie na komputerze z systemem Windows, w emulatorze urządzenia z systemem Windows lub na komputerze zdalnym lub urządzeniu.

  • Dane wejściowe i wyjściowe dla cieniowania wierzchołków i geometrycznych: możliwość wyświetlania danych wejściowych i wyjściowych cieniowania wierzchołków i cieniowania geometrii była jedną z najbardziej żądanych funkcji. Ta funkcja jest teraz obsługiwana w narzędziach. Wybierz etap VS lub GS w widoku Etapy potoku, aby rozpocząć inspekcję danych wejściowych i wyjściowych w poniższej tabeli.

    Dane wejściowe/wyjściowe dla cieniowania.

  • Wyszukiwanie i filtrowanie w tabeli obiektów: zapewnia szybki i łatwy sposób znajdowania szukanych zasobów.

    Zrzut ekranu przedstawiający sekcję Tabela obiektów z wyświetlonymi listami rozwijanymi Typ i Polem tekstowym Wyszukiwanie.

  • Historia zasobów: ten nowy widok zapewnia usprawniony sposób wyświetlania całej historii modyfikacji zasobu, który był używany podczas renderowania przechwyconej ramki. Aby wywołać historię dowolnego zasobu, kliknij ikonę zegara obok dowolnego hiperłącza zasobu.

    Historia zasobów.

    Zostanie wyświetlone nowe okno narzędzia Historia zasobów wypełnione historią zmian zasobu.

    Zmiana historii zasobów.

    Można przechwytywać ramki z włączonym przechwytywaniem pełnego stosu wywołań. Dzięki temu można szybko poznać kontekst każdego zdarzenia zmiany i sprawdzić go w projekcie programu Visual Studio. Ustaw opcję pełnego przechwytywania stosu w oknie dialogowym Opcje narzędzi > Programu Visual Studio w obszarze Diagnostyka grafiki.

  • Statystyki interfejsu API: wyświetl ogólne podsumowanie użycia interfejsu API w ramce. Jest to przydatne do odkrywania połączeń, które możesz nie zdawać sobie sprawy, że robisz w ogóle, lub dzwonisz zbyt często. To okno jest dostępne za pośrednictwem funkcji Wyświetl > statystyki interfejsu API w analizatorze grafiki programu Visual Studio.

    Statystyki interfejsu API.

  • Statystyki pamięci: wyświetl ilość pamięci przydzielanej przez sterownik dla zasobów tworzonych w ramce. To okno jest dostępne za pośrednictwem funkcji Wyświetl > statystyki pamięci w Analizatorze grafiki programu Visual Studio. Aby skopiować dane do pliku CSV do wyświetlania w arkuszu kalkulacyjnym, kliknij prawym przyciskiem myszy i wybierz polecenie Kopiuj wszystko.

    Statystyki pamięci.

  • Walidacja ramek: nowa lista błędów i ostrzeżeń umożliwia łatwe nawigowanie po liście zdarzeń na podstawie potencjalnych problemów wykrytych przez warstwę debugowania Direct3D. Kliknij pozycję Wyświetl > walidację ramki w Analizatorze grafiki programu Visual Studio, aby otworzyć okno. Następnie kliknij przycisk Uruchom walidację , aby rozpocząć analizę. Ukończenie ramki może potrwać kilka minut, w zależności od złożoności ramki.

    Walidacja ramki.

  • Analiza ramek dla D3D12: Użyj analizy ramek, aby analizować wydajność wywołań rysowania z ukierunkowanymi eksperymentami "what-if". Przejdź do karty Analiza ramek i uruchom analizę, aby wyświetlić raport.

    Analiza ramek.

  • Ulepszenia użycia procesora GPU: ślady otwierania można pobrać za pośrednictwem profilera użycia procesora GPU programu Visual Studio za pomocą elementu GPUView lub narzędzia Windows Analizator wydajności (WPA), aby uzyskać bardziej szczegółową analizę. Jeśli masz zainstalowany zestaw narzędzi Windows Performance Toolkit, istnieją dwa hiperlinki: jeden dla usługi WPA, a drugi dla widoku GPUView, w prawym dolnym rogu przeglądu sesji.

    Użycie procesora GPU.

    Ślady otwierane w widoku GPUView za pośrednictwem tego linku obsługują synchronizowane powiększanie osi czasu vs i gpuView oraz przesuwanie. Pole wyboru w programie VS określa, czy synchronizacja jest włączona, czy nie.

    GpuView.