Condividi tramite


Novità di C++ in Visual Studio 2017

In Visual Studio 2017 sono stati inclusi numerosi aggiornamenti e correzioni per l'ambiente Visual C++. Sono stati corretti oltre 250 bug e sono stati segnalati problemi nel compilatore e negli strumenti. Molti sono stati inviati dai clienti tramite il report di un problema e fornire un suggerimento in Invia commenti e suggerimenti. Microsoft ringrazia i clienti per le segnalazioni inviate.

Per altre informazioni sulle novità in tutto Visual Studio, vedere Novità in Visual Studio 2017. Per informazioni sulle novità di C++ in Visual Studio 2019, vedere Novità di C++ in Visual Studio 2019. Per informazioni sulle novità per C++ in Visual Studio 2015 e versioni precedenti, vedere Visual C++: novità dalla versione 2003 alla 2015. Per informazioni sulle novità della documentazione di C++, vedere Documentazione di Microsoft C++: Novità.

Compilatore C++ di Visual Studio 2017

Miglioramenti della conformità di C++

In questa versione è stato aggiornato il compilatore C++ e la libreria standard con il supporto avanzato per le funzionalità C++11 e C++14. Include anche il supporto preliminare per alcune funzionalità previste nello standard C++17. Per informazioni dettagliate, vedere Miglioramenti della conformità di C++ in Visual Studio 2017.

Visual Studio 2017 versione 15.5

Il compilatore supporta il 75% circa delle nuove funzionalità di C++17, inclusi binding strutturati, espressioni lambda constexpr, if constexpr, variabili inline, espressioni di riduzione e aggiunta di noexcept al sistema di tipi. Queste funzionalità sono disponibili nell'opzione /std:c++17 . Per altre informazioni, vedere Miglioramenti della conformità di C++ in Visual Studio 2017.

Visual Studio 2017 versione 15.7

Il set di strumenti del compilatore MSVC in Visual Studio versione 15.7 è ora conforme allo standard C++. Per altre informazioni, vedere Annuncio: MSVC è conforme alla conformità del linguaggio C++ Standard e Microsoft C/C++.

Visual Studio 2017 versione 15.8

L'opzione del /experimental:preprocessor compilatore abilita il nuovo preprocessore MSVC sperimentale che alla fine sarà conforme a tutti gli standard C e C++ applicabili. Per altre informazioni, vedere Panoramica del nuovo preprocessore MSVC.

Nuove opzioni del compilatore

  • /permissive-: abilitare tutte le opzioni del compilatore di conformità standard rigorose e disabilitare la maggior parte delle estensioni del compilatore specifiche di Microsoft (ma non __declspec(dllimport), ad esempio). Questa opzione è attiva per impostazione predefinita in Visual Studio 2017 versione 15.5. La /permissive- modalità di conformità include il supporto per la ricerca dei nomi in due fasi. Per altre informazioni, vedere Miglioramenti della conformità di C++ in Visual Studio.

  • /diagnostics: abilita la visualizzazione dell'errore di diagnostica o della posizione dell'avviso in tre modi diversi: solo il numero di riga, il numero di riga e la colonna o il numero di riga e la colonna, con un cursore sotto la riga di codice che causa l'errore.

  • /debug:fastlink: abilita fino al 30% di tempi di collegamento incrementali più veloci (rispetto a Visual Studio 2015) non copiando tutte le informazioni di debug nel file PDB. Il file PDB punta invece alle informazioni di debug per i file di libreria e oggetto usati per creare il file eseguibile. Vedere Ciclo di compilazione C++ più veloce in Visual Studio "15" con /Debug:fastlink e Raccomandazioni per velocizzare le compilazioni C++ in Visual Studio.

  • Visual Studio 2017 consente di usare /sdl con /await. È stata rimossa la /RTC limitazione con coroutine.

Visual Studio 2017 versione 15.3
  • /std:c++14 e /std:c++latest: queste opzioni del compilatore consentono di acconsentire esplicitamente a versioni specifiche del linguaggio di programmazione ISO C++ in un progetto. La maggior parte delle nuove funzionalità standard bozza è protetta dall'opzione /std:c++latest .

  • /std:c++17 abilita il set di funzionalità di C++17 implementate dal compilatore. Questa opzione disabilita il supporto del compilatore e della libreria standard per le funzionalità dopo C++17: quelle modificate o nuove nelle versioni successive della bozza di lavoro e gli aggiornamenti difetti dello standard C++. Per abilitare queste funzionalità, usare /std:c++latest.

Codegen, sicurezza, diagnostica e controllo delle versioni

In questa versione sono stati introdotti numerosi miglioramenti per l'ottimizzazione, la generazione del codice, il controllo delle versioni del set di strumenti e la diagnostica. Ecco alcuni dei miglioramenti più rilevanti:

  • Miglioramento della generazione del codice per i cicli: supporto della vettorializzazione automatica della divisione di interi costanti, migliore identificazione dei modelli memset.
  • Sicurezza del codice migliorata: miglioramento delle emissioni di diagnostica del compilatore di sovraccarico del buffer e /guard:cf ora protegge le istruzioni switch che generano tabelle di salto.
  • Controllo delle versioni: il valore della macro preprocessore predefinito _MSC_VER viene ora aggiornato in modo monotonico a ogni aggiornamento del set di strumenti di Visual C++. Per altre informazioni, vedere il post relativo alla versione del compilatore Visual C++.
  • Nuovo layout del set di strumenti: il compilatore e gli strumenti di compilazione correlati hanno un nuovo percorso e una nuova struttura di directory nel computer di sviluppo. Il nuovo layout consente installazioni side-by-side di più versioni del compilatore. Per altre informazioni, vedere il post Compiler Tools Layout in Visual Studio 2017 (Layout degli strumenti del compilatore in Visual Studio 2017).
  • Miglioramenti alla diagnostica: nella finestra di output ora appare la colonna in cui si verifica un errore. Per altre informazioni, vedere il post C++ compiler diagnostics improvements in VS "15" Preview 5 (Miglioramenti della diagnostica del compilatore C++ in VS "15" anteprima 5).
  • Quando si usano coroutine, la parola chiave sperimentale yield (disponibile nell'opzione /await ) è stata rimossa. È necessario aggiornare il codice per l'uso di co_yield. Per altre informazioni, vedere La parola chiave yield diventa co_yield in Visual Studio 2017.
Visual Studio 2017 versione 15.3

Miglioramenti alla diagnostica nel compilatore. Per altre informazioni, vedere Diagnostic Improvements in Visual Studio 2017 15.3.0 (Miglioramenti della diagnostica in Visual Studio 2017 15.3.0).

Visual Studio 2017 versione 15.5

Le prestazioni del runtime di Visual C++ continuano a migliorare grazie a una migliore qualità del codice generata. Ora è sufficiente ricompilare il codice e l'app viene eseguita più velocemente. Alcune ottimizzazioni del compilatore sono totalmente nuove, come la vettorizzazione di archivi scalari condizionali, la combinazione di chiamate sin(x) e cos(x) in una nuova funzione sincos(x) e l'eliminazione di istruzioni ridondanti dall'ottimizzatore SSA. Altre ottimizzazioni del compilatore sono miglioramenti alle funzionalità esistenti, ad esempio: euristica del vettore per le espressioni condizionali, ottimizzazioni dei cicli migliori e codegen min/max float. Il linker ha un'implementazione nuova e più veloce /OPT:ICF , che può comportare fino al 9% di velocità del tempo di collegamento e ci sono altre correzioni delle prestazioni nel collegamento incrementale. Per altre informazioni, vedere /OPT (Ottimizzazioni) e /INCREMENTAL (collegamento incrementale).

Il compilatore Microsoft C++ supporta AVX-512 di Intel. Include istruzioni per la lunghezza vettoriale che portano nuove funzioni nei registri AVX-512 a 128 bit e a 256 bit wide.

L'opzione /Zc:noexceptTypes- può essere usata per ripristinare la versione C++14 di noexcept durante l'uso della modalità C++17 in generale. Questa opzione consente di aggiornare il codice sorgente per garantire la conformità a C++17 senza dover riscrivere contemporaneamente tutto il codice throw(). Per altre informazioni, vedere Dynamic exception specification removal and noexcept (Rimozione della specifica di eccezione dinamica e noexcept).

Visual Studio 2017 versione 15.7
  • Nuova opzione del compilatore /Qspectre che consente di ridurre i rischi di attacchi side-channel di esecuzione speculativa. Per altre informazioni, vedere Spectre mitigations in MSVC (Mitigazioni Spectre in MSVC).
  • Nuovo avviso di diagnostica per la mitigazione Spectre. Per altre informazioni, vedere Spectre diagnostic in Visual Studio 2017 Version 15.7 Preview 4 (Diagnostica Spectre in Visual Studio 2017 versione 15.7 Preview 4).
  • Un nuovo valore per /Zc, /Zc:__cplusplus, consente la segnalazione corretta del supporto standard C++. Ad esempio, quando l'opzione è impostata e il compilatore è in /std:c++17 modalità il valore si espande su 201703L. Per altre informazioni, vedere MSVC now correctly reports __cplusplus (MSVC ora segnala correttamente __cplusplus).

Libreria standard C++

Miglioramenti della correttezza

Visual Studio 2017 RTM (versione 15.0)
  • Miglioramenti di diagnostica secondari basic_string _ITERATOR_DEBUG_LEVEL != 0 . Quando un controllo IDL viene ritagliato in macchinari stringa, ora segnala il comportamento specifico che ha causato il viaggio. Ad esempio, anziché "iteratore stringa non dereferenziabile" si ottiene "cannot dereference string iterator because iterator is out of range (ad esempio, an end iterator)".
  • È stato corretto l'operatore di assegnazione di spostamento di std::promise, che in precedenza causava il blocco irreversibile del codice.
  • Sono stati corretti gli errori del compilatore relativi alla conversione implicita di atomic<T*> in T*.
  • pointer_traits<Ptr> ora rileva correttamente Ptr::rebind<U>.
  • È stata corretta la mancanza di un qualificatore const nell'operatore di sottrazione move_iterator.
  • È stato corretto codegen non interattivo errato per gli allocatori definiti dall'utente con stato che richiedono propagate_on_container_copy_assignment e propagate_on_container_move_assignment.
  • atomic<T> ora tollera operator&() con overload.
  • La diagnostica del compilatore è stata leggermente migliorata per le chiamate a bind() non corrette.

Esistono altri miglioramenti della libreria standard in Visual Studio 2017 RTM. Per un elenco completo, vedere la voce del blog del team C++ Standard Library Fixes In VS 2017 RTM (Correzioni della libreria standard in VS 2017 RTM).

Visual Studio 2017 versione 15.3
  • I contenitori della libreria standard fissano ora max_size() a numeric_limits<difference_type>::max() anziché a max() di size_type. Questa modifica garantisce che il risultato di distance() per gli iteratori di tale contenitore sia rappresentabile nel tipo restituito di distance().
  • Correzione della specializzazione mancante auto_ptr<void>.
  • Gli for_each_n()algoritmi , generate_n()e search_n() in precedenza non riuscirono a compilare se l'argomento length non era un tipo integrale. Ora tentano di convertire le lunghezze non di gral negli iteratori' difference_type.
  • normal_distribution<float> non genera più avvisi nella libreria standard in merito alla conversione da double a float.
  • Sono state corrette alcune operazioni basic_string che usavano npos invece di max_size() durante il controllo dell'overflow delle dimensioni massime.
  • condition_variable::wait_for(lock, relative_time, predicate) aspetterebbe l'intero tempo relativo se ci fosse una riattivazione spuria. Ora attende solo un singolo intervallo del tempo relativo.
  • future::get() ora invalida future, come richiesto dallo standard.
  • iterator_traits<void *> era un errore complesso perché indicava un tentativo di formare void&. Ora diventa semplicemente uno struct vuoto, consentendo l'uso di iterator_traits nelle condizioni SFINAE "is iterator".
  • Sono stati corretti alcuni avvisi segnalati da Clang -Wsystem-headers .
  • Correzione anche di "specifica di eccezione nella dichiarazione non corrispondente alla dichiarazione precedente" segnalata da Clang -Wmicrosoft-exception-spec.
  • Sono stati corretti anche gli avvisi relativi all'ordinamento dell'elenco degli inizializzatori dei membri segnalati da Clang e C1XX.
  • I contenitori non ordinati non scambiavano le funzioni hash o i predicati corrispondenti quando venivano scambiati i contenitori stessi. Ora lo fanno.
  • Molte operazioni di scambio del contenitore sono ora contrassegnate con noexcept. La libreria standard infatti non intende mai generare un'eccezione quando rileva una condizione di comportamento non definita non-equal-allocator propagate_on_container_swap.
  • Molte operazioni vector<bool> sono ora contrassegnate con noexcept.
  • La libreria standard applica ora l'allocatore value_type corrispondente (in modalità C++17) con un tratteggio di escape di rifiuto esplicito.
  • Sono state corrette alcune condizioni nelle quali un'operazione self-range-insert in basic_string compromette il contenuto delle stringhe. (Nota: lo standard proibisce ancora le operazioni self-range-insert in vettori.)
  • propagate_on_container_swap dell'allocatore non influisce più su basic_string::shrink_to_fit().
  • std::decay ora gestisce i tipi di funzione abominabili, ovvero i tipi di funzione qualificati cv, ref-qualified o entrambi.
  • Modifica delle direttive include per l'uso corretto della distinzione tra maiuscole e minuscole e delle barre, con miglioramento della portabilità.
  • Correzione dell'avviso C4061 "enumeratore 'enumeratore' nell'opzione dell'enumerazione 'enumeration' non viene gestito in modo esplicito da un'etichetta case". Questo avviso è disattivato per impostazione predefinita ed è stato risolto come eccezione ai criteri generali della libreria standard per gli avvisi. La libreria standard è /W4 pulita, ma non tenta di essere /Wall pulita. Molti avvisi disattivati per impostazione predefinita sono insolitamente rumorosi e non devono essere usati regolarmente.
  • Sono stati migliorati i controlli di debug per std::list. Gli iteratori di elenco controllano ora operator->() e list::unique() contrassegna ora gli iteratori come invalidati.
  • È stata corretta la metaprogrammazione uses-allocator in tuple.
Visual Studio 2017 versione 15.5
  • std::partition ora chiama i tempi del predicato N invece di N + 1 volte, come richiesto dallo standard.
  • I tentativi di evitare statici magic nella versione 15.3 vengono ripristinati nella versione 15.5.
  • std::atomic<T> non richiede più che T sia costruibile per impostazione predefinita.
  • Gli algoritmi heap che richiedono tempo logaritmico si comportano in modo diverso quando è abilitato il debug dell'iteratore. Non eseguono più un'asserzione temporale lineare che l'input è in effetti un heap.
  • __declspec(allocator) viene mantenuta solo per C1XX, per evitare avvisi da Clang, che non la comprende.
  • basic_string::npos è ora disponibile come costante della fase di compilazione.
  • std::allocator In modalità C++17 ora gestisce correttamente l'allocazione di tipi sovraallineare, ovvero i tipi il cui allineamento è maggiore di max_align_t, a meno che non sia disabilitato da /Zc:alignedNew-. Ad esempio, i vettori di oggetti con allineamento a 16 o 32 byte vengono ora correttamente allineati per le istruzioni SSE e AVX.

Miglioramenti della conformità

  • Sono stati aggiunti <any>, <string_view>, apply(), make_from_tuple().
  • Sono stati aggiunti <optional>, <variant>, shared_ptr::weak_type e <cstdalign>.
  • È stato abilitato C++ 14 constexpr in min(initializer_list), max(initializer_list) e minmax(initializer_list) e min_element(), max_element() e minmax_element().

Per altre informazioni, vedere Conformità al linguaggio Microsoft C/C++.

Visual Studio 2017 versione 15.3
  • Sono state implementate diverse altre funzionalità di C++17. Per altre informazioni, vedere la tabella di conformità del linguaggio Microsoft C++.
  • Implementazione di P0602R0 "variant e optional devono propagare trivially_move e trivially_copy".
  • La libreria standard ora tollera ufficialmente la disabilitazione dell'opzione RTTI dinamica tramite l'opzione /GR-. Sia dynamic_pointer_cast() che rethrow_if_nested() richiedono dynamic_castintrinsecamente , quindi la libreria standard ora li contrassegna come =delete in /GR-.
  • Anche quando RTTI dinamico è disabilitato tramite /GR-, "RTTI statico" sotto forma di typeid(SomeType) è ancora disponibile e alimenta diversi componenti della libreria standard. La libreria standard supporta ora anche la disabilitazione di questa funzionalità tramite /D_HAS_STATIC_RTTI=0. Questo flag disabilita anche le funzioni membro std::any, target() e target_type() di std::function e la funzione membro Friend get_deleter() di std::shared_ptr e std::weak_ptr.
  • La libreria standard ora usa constexpr di C++14 in modo non condizionale, anziché usare macro definite in modo condizionale.
  • La libreria standard ora usa modelli di alias internamente.
  • La libreria standard ora usa nullptr internamente, anziché usare nullptr_t{}. L'utilizzo interno di NULL viene cancellato. L'utilizzo interno di 0-as-null viene pulito gradualmente.
  • La libreria standard ora usa std::move() internamente, anziché usare std::forward() in modo stilisticamente non corretto.
  • È stata effettuata la modifica di static_assert(false, "message") in #error message. Questa modifica migliora la diagnostica del compilatore, perché #error interrompe immediatamente la compilazione.
  • La libreria standard non contrassegna più le funzioni con __declspec(dllimport). Ciò non è più richiesto dalla tecnologia dei linker moderni.
  • Estrazione di SFINAE negli argomenti del modello predefiniti, con conseguente riduzione della confusione rispetto ai tipi restituiti e ai tipi di argomenti delle funzioni.
  • I controlli di debug in <modo casuale> ora usano i normali macchinari della libreria standard, anziché la funzione _Rng_abort()interna , che ha chiamato fputs() a stderr. L'implementazione di questa funzione viene mantenuta per la compatibilità binaria. Verrà rimosso nella prossima versione binaria non compatibile con la libreria standard.
Visual Studio 2017 versione 15.5
  • Sono state aggiunte, deprecate o rimosse diverse funzionalità della libreria standard in base allo standard C++17. Per altre informazioni, vedere Miglioramenti della conformità di C++ in Visual Studio.
  • Supporto sperimentale per gli algoritmi paralleli seguenti:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • Le firme per gli algoritmi paralleli seguenti vengono aggiunte ma non parallelizzate in questo momento. La profilatura non ha mostrato alcun vantaggio nell'parallelizzazione degli algoritmi che spostano o permute solo gli elementi:
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017 versione 15.6
  • <memory_resource>
  • Library Fundamentals V1
  • Eliminazione dell'assegnazione polymorphic_allocator
  • Miglioramento della deduzione dell'argomento del modello della classe
Visual Studio 2017 versione 15.7
  • il supporto per gli algoritmi paralleli non è più sperimentale
  • Nuova implementazione di <filesystem>
  • Conversioni di stringhe elementari (parziale)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • Evitare il decadimento non necessario
  • Funzioni matematiche speciali
  • constexpr char_traits
  • Guide alla deduzione per la libreria standard

Per altre informazioni, vedere Conformità al linguaggio Microsoft C/C++.

Correzioni per prestazioni e velocità effettiva

  • Gli overload di basic_string::find(char) chiamano traits::find solo una volta. In precedenza questa funzione era implementata come una ricerca di stringa generale avente come obiettivo una stringa di lunghezza 1.
  • basic_string::operator== ora controlla le dimensioni delle stringhe prima di confrontarne il contenuto.
  • È stato rimosso l'accoppiamento dei controlli in basic_string, di difficile analisi per l'ottimizzatore del compilatore. Per tutte le stringhe brevi, una chiamata a reserve ha comunque un costo, anche se non viene eseguita alcuna operazione.
  • std::vector è stata modificata per correttezza e prestazioni: l'aliasing durante le operazioni di inserimento e di inserimento è ora gestito correttamente come richiesto dallo Standard, la garanzia di eccezione assoluta viene ora fornita quando richiesto dallo standard tramite move_if_noexcept() e altre logiche, e l'inserimento eseguono meno operazioni sugli elementi.
  • La libreria standard C++ ora evita la dereferenziazione dei puntatori null ricercati.
  • Sono state migliorate le prestazioni di weak_ptr::lock().
  • Per aumentare la velocità effettiva del compilatore, le intestazioni della libreria standard C++ evitano ora di includere dichiarazioni per le funzioni intrinseche del compilatore non indispensabili.
  • Sono state migliorate più del triplo le prestazioni dei costruttori di spostamento di std::string e std::wstring.
Visual Studio 2017 versione 15.3
  • Sono state usate le interazioni con noexcept, che ha impedito l'inlining dell'implementazione std::atomic in funzioni che usano la gestione delle eccezioni strutturate (SEH).
  • È stata modificata la funzione _Deallocate() interna della libreria standard per ottimizzare le dimensioni del codice, consentendone l'implementazione inline in più posizioni.
  • Sono state apportate modifiche a std::try_lock() per consentire l'uso dell'espansione di pacchetto invece della ricorsione.
  • È stato migliorato l'algoritmo per la prevenzione di deadlock di std::lock() con l'uso di operazioni lock() al posto della rotazione di try_lock() in tutti i blocchi.
  • È stata abilitata l'ottimizzazione del valore restituito denominato in system_category::message().
  • conjunction e disjunction ora crea N + 1 un'istanza dei tipi, invece di 2N + 2 tipi.
  • std::function non crea più istanze del meccanismo di supporto degli allocatori per ogni chiamata di cancellazione dei tipi, con conseguente miglioramento della velocità e riduzione delle dimensioni dei file con estensione obj nei programmi che passano molte espressioni lambda distinte a std::function.
  • allocator_traits<std::allocator>contiene operazioni std::allocator implementate inline manualmente, con conseguente riduzione delle dimensioni nel codice che interagisce con std::allocator solo tramite allocator_traits ovvero la maggior parte del codice.
  • L'interfaccia minima dell'allocatore C++11 viene ora gestita dalla libreria standard che chiama direttamente allocator_traits, invece di eseguire il wrapping dell'allocatore in _Wrap_alloc di una classe interna. Questa modifica consente di ridurre le dimensioni del codice generato per il supporto dell'allocatore e di migliorare la capacità dell'ottimizzatore di interpretare i contenitori della libreria standard in alcuni casi. Consente anche una migliore esperienza di debug, perché è ora possibile vedere il tipo di allocatore anziché dover ricorrere a _Wrap_alloc<your_allocator_type> nel debugger.
  • È stata rimossa la metaprogrammazione per gli allocator::referenceallocatori personalizzati che non sono autorizzati a personalizzare. (Gli allocatori possono fare in modo che i contenitori usino puntatori fantasiosi, ma non riferimenti fantasiosi.)
  • Il front-end del compilatore è stato addestrato ad annullare il wrapping degli iteratori di debug nei cicli for basati su intervalli, con conseguente miglioramento delle prestazioni delle build di debug.
  • Il percorso di riduzione interno di basic_string per shrink_to_fit() e reserve() non è più nel percorso delle operazioni di riallocazione, con conseguente riduzione delle dimensioni del codice per tutti i membri mutanti.
  • Il percorso di crescita interno di basic_string non è più nel percorso di shrink_to_fit().
  • Le operazioni di mutazione di basic_string vengono ora sottoposte a factoring nelle funzioni del percorso veloce senza allocazione e del percorso lento con allocazione, quindi l'implementazione inline nei chiamanti del caso comune senza riallocazione diventa più probabile.
  • Le basic_string operazioni di modifica creano ora buffer riallocati nello stato preferito anziché ridimensionare sul posto. Ad esempio, un inserimento all'inizio di una stringa sposta ora il contenuto dopo l'inserimento esattamente una volta. Viene spostato verso il basso o nel buffer appena allocato. Non viene più spostato due volte nel caso di riallocazione, prima nel buffer appena allocato e poi inattivo.
  • Le operazioni che chiamano la libreria standard C in <string> ora memorizzano nella cache l'indirizzo di errno per evitare interazioni ripetute con TLS.
  • L'implementazione di is_pointer è stata semplificata.
  • È stata completata la modifica dell'espressione SFINAE da basata su funzioni a basata su struct e void_t.
  • Gli algoritmi della libreria standard ora evitano il post-incremento degli iteratori.
  • Correzione degli avvisi di troncamento durante l'uso di allocatori a 32 bit in sistemi a 64 bit.
  • L'assegnazione di spostamento di std::vector è ora più efficiente nel caso di allocatori non uguali e non POCMA, grazie al riutilizzo del buffer quando possibile.
Visual Studio 2017 versione 15.5
  • basic_string<char16_t>a coinvolge ora le stesse ottimizzazioni memcmp e memcpy, nonché ottimizzazioni simili attivate da basic_string<wchar_t>.
  • È stata corretta una limitazione dell'ottimizzatore che impediva ai puntatori a funzione di essere esposti inline tramite le "funzioni per evitare la copia" nell'aggiornamento 3 di Visual Studio 2015, ripristinando le prestazioni di lower_bound(iter, iter, function pointer).
  • È stato ridotto l'overhead della verifica degli ordini di input del debug dell'iteratore in includes, set_difference, set_symmetric_difference e set_union, tramite la rimozione del wrapping degli iteratori prima del controllo dell'ordine.
  • std::inplace_merge ora ignora gli elementi che sono già in posizione.
  • La costruzione di std::random_device non costruisce più e quindi distrugge std::string.
  • std::equal e std::partition eseguivano un calcolo per l'ottimizzazione dei thread dei collegamenti che salvava un confronto di iteratori.
  • Quando std::reverse viene passato puntatori a facilmente copiabile T, ora invia a un'implementazione vettorializzata a mano.
  • std::fill, std::equal e std::lexicographical_compare sono ora in grado di inviare memset e memcmp per std::byte e gsl::byte (e altre enumerazioni e classi di enumerazione di tipo char). Dato che std::copy esegue l'invio tramite is_trivially_copyable non ha richiesto alcuna modifica.
  • La libreria standard non contiene più distruttori con parentesi graffe vuote il cui unico comportamento consisteva nel creare tipi non facilmente distruttibili.

Altre librerie

Supporto delle librerie open source

Vcpkg è un strumento open source da riga di comando che semplifica notevolmente il processo di acquisizione e di creazione di librerie statiche e DLL C++ open source in Visual Studio. Per altre informazioni, vedere vcpkg.

CPPRestSDK 2.9.0

Visual Studio 2017 versione 15.5

CPPRestSDK, un'API Web multipiattaforma per C++, viene aggiornata alla versione 2.9.0. Per altre informazioni, vedere il post sulla disponibilità di CppRestSDK 2.9.0 su GitHub.

ATL

Visual Studio 2017 versione 15.5
  • Un altro set di correzioni per la conformità della ricerca dei nomi
  • I costruttori di spostamento esistenti e gli operatori di assegnazione di spostamento sono ora contrassegnati correttamente come non di aumento
  • Annullamento dell'eliminazione dell'avviso valido C4640 relativo all'inizializzazione thread-safe di elementi statici locali in atlstr.h
  • L'inizializzazione thread-safe di statici locali è stata disattivata automaticamente nel set di strumenti XP quando si usa ATL per compilare una DLL. Ora non è così. È possibile aggiungere /Zc:threadSafeInit- le impostazioni di Project se non si vuole l'inizializzazione thread-safe.

Runtime di Visual C++

  • Nuova intestazione "cfguard.h" per i simboli di protezione del flusso di controllo.

Visual Studio 2017 C++ IDE

  • Le prestazioni di modifica della configurazione sono ora migliori per i progetti nativi C++ e molto migliori per i progetti C++/CLI. Quando una configurazione della soluzione viene attivata per la prima volta, è più veloce e tutte le attivazioni successive di questa configurazione della soluzione sono quasi istantanee.
Visual Studio 2017 versione 15.3
  • Sono state riscritte diverse procedure guidate per il progetto e il codice nello stile basato su finestre di dialogo.
  • Aggiungi classe ora avvia direttamente la procedura guidata Aggiungi classe. Tutti gli altri elementi che in precedenza erano qui sono ora disponibili in Aggiungi > nuovo elemento.
  • I progetti Win32 ora sono inclusi nella categoria Windows Desktop nella finestra di dialogo Nuovo progetto.
  • I modelli Applicazione console di Windows e Applicazione desktop di Windows ora creano i progetti senza visualizzare una procedura guidata. Nella stessa categoria è presente una nuova Creazione guidata applicazione desktop di Windows, che visualizza le stesse opzioni della procedura guidata Applicazione console Win32.
Visual Studio 2017 versione 15.5

Diverse operazioni C++ che usano il motore IntelliSense per il refactoring e lo spostamento di codice vengono eseguite molto più velocemente. I numeri seguenti sono basati sulla soluzione di Visual Studio Chromium con i progetti 3500:

Funzionalità Miglioramento delle prestazioni
Rinomina 5.3x
Modifica firma 4.5x
Trova tutti i riferimenti 4.7x

C++ supporta ora Ctrl+ clic Vai a definizione, semplificando lo spostamento del mouse sulle definizioni. Anche il visualizzatore della struttura appartenente al pacchetto di strumenti di potenziamento della produttività è ora incluso nel prodotto per impostazione predefinita.

IntelliSense

  • Il nuovo motore di database basato su SQLite viene ora usato per impostazione predefinita. Il nuovo motore velocizza le operazioni di database, ad esempio Vai a definizione e Trova tutti i riferimenti. Migliora significativamente il tempo di analisi iniziale della soluzione. L'impostazione è stata spostata in Strumenti Opzioni Editor > di testo C/C++ > Avanzate.> > (Era in precedenza sotto ... C/C++ > Sperimentale.

  • Sono state migliorate le prestazioni di IntelliSense nei progetti e nei file che non usano intestazioni precompilate. Viene creata un'intestazione precompilata automatica per le intestazioni nel file corrente.

  • Sono state aggiunte funzioni di filtro e guida per gli errori di IntelliSense presenti nell'elenco errori. È ora possibile fare clic sulla colonna degli errori per applicare un filtro. Inoltre, facendo clic sugli errori specifici o premendo F1 viene avviata una ricerca online per il messaggio di errore.

    Elenco errori.

    Elenco errori filtrato.

  • È stata aggiunta la possibilità di filtrare per tipo gli elementi dell'elenco dei membri.

    Filtro elenco membri.

  • È stata aggiunta una nuova funzionalità sperimentale IntelliSense predittiva che fornisce un elenco di risultati filtrato e compatibile con il contesto per l'elenco dei membri. Per altre informazioni, vedere C++ IntelliSense Improvements - Predictive IntelliSense & Filtering (Miglioramenti di IntelliSense per C++ - IntelliSense predittiva e filtri).

  • Trova tutti i riferimenti (Maiusc+F12) ora consente di spostarsi con facilità, anche nelle codebase complesse. Offre funzioni avanzate di raggruppamento, filtro, ordinamento, ricerca all'interno dei risultati e, per alcuni linguaggi, colorazione, che agevolano notevolmente la comprensione dei riferimenti. Per C++ la nuova interfaccia utente include informazioni che indicano se è in corso la lettura o la scrittura in una variabile.

  • La funzionalità IntelliSense da punto a freccia passa da sperimentale a avanzata ed è ora abilitata per impostazione predefinita. Le funzionalità dell'editor Espandono ambiti ed Espandi precedenza sono state spostate da sperimentali a avanzate.

  • Le funzionalità di refactoring sperimentali Cambia firma ed Estrai funzione sono ora disponibili per impostazione predefinita.

  • È stata aggiunta una funzionalità sperimentale per il caricamento più rapido dei progetti C++. Alla prossima apertura, un progetto C++ verrà caricato molto più velocemente e la volta successiva ancora più velocemente.

  • Alcune di queste funzionalità sono usate anche in altri linguaggi e alcune sono specifiche di C++. Per altre informazioni su queste nuove funzionalità, vedere Announcing Visual Studio "15" Preview 5 (Annuncio di Visual Studio 15 Preview 5).

Visual Studio 2017 versione 15.7

Progetti non MSBuild con Apri cartella

Visual Studio 2017 introduce la funzionalità Apri cartella . Consente di scrivere codice, compilare ed eseguire il debug in una cartella contenente codice sorgente senza la necessità di creare soluzioni o progetti. Ora è più semplice iniziare a usare Visual Studio, anche se il progetto non è un progetto basato su MSBuild. Apri cartella consente di accedere a funzionalità avanzate di comprensione del codice, modifica, compilazione e debug. Sono gli stessi forniti da Visual Studio per i progetti MSBuild. Per altre informazioni, vedere Progetti Apri cartella per C++.

  • Sono stati apportati miglioramenti all'esperienza Apri cartella. È possibile personalizzare l'esperienza tramite questi file .json:
    • CppProperties.json per personalizzare l'esperienza IntelliSense e di esplorazione.
    • Tasks.json per personalizzare le procedure di compilazione.
    • Launch.json per personalizzare l'esperienza di debug.
Visual Studio 2017 versione 15.3
  • Supporto migliorato per i compilatori alternativi e gli ambienti di compilazione, come MinGW e Cygwin. Per altre informazioni, vedere Using MinGW and Cygwin with Visual C++ and Open Folder (Uso di MinGW e Cygwin con Visual C++ e Apri cartella).
  • È stato aggiunto il supporto per la definizione di variabili di ambiente globali e specifiche della configurazione in CppProperties.json e CMakeSettings.json. Queste variabili di ambiente possono essere usate dalle configurazioni di debug definite in launch.vs.json e dalle attività in tasks.vs.json. Per altre informazioni, vedere Customizing your Environment with Visual C++ and Open Folder (Personalizzazione dell'ambiente in uso con Visual C++ e Apri cartella).
  • È stato migliorato il supporto del generatore Ninja di CMake, inclusa la possibilità di creare facilmente codice destinato alle piattaforme a 64 bit.

Supporto CMake con Apri cartella

Visual Studio 2017 introduce il supporto per l'uso dei progetti CMake senza la conversione in file di progetto di MSBuild (con estensione vcxproj). Per altre informazioni, vedere Progetti CMake in Visual Studio. L'apertura di progetti CMake con Apri cartella configura automaticamente l'ambiente per la modifica, la compilazione e il debug di C++.

  • IntelliSense C++ funziona senza alcuna necessità di creare un file CppProperties.json nella cartella radice. È stato aggiunto un nuovo elenco a discesa per consentire agli utenti di passare facilmente da una configurazione all'altra fornita da CMake e CppProperties.json file.

  • Supporto per configurazione aggiuntiva tramite un file CMakeSettings.json che si trova nella stessa cartella del file CMakeLists.txt.

    CMake Apri cartella.

Visual Studio 2017 versione 15.3
  • è stato aggiunto il supporto per il generatore Ninja CMake.
Visual Studio 2017 versione 15.4
  • è stato aggiunto il supporto per l'importazione di cache CMake esistenti.
Visual Studio 2017 versione 15.5
  • è stato aggiunto il supporto per CMake 3.11, analisi del codice nei progetti CMake, visualizzazione Destinazioni in Esplora soluzioni, opzioni per la generazione della cache e la compilazione di singoli file. Per altre informazioni, vedere CMake Support in Visual Studio (Supporto di CMake in Visual Studio) e Progetti CMake in Visual Studio.

Sviluppo per il desktop di Windows

È ora disponibile un'esperienza più granulare per l'installazione del carico di lavoro per C++ originario. Sono stati aggiunti componenti selezionabili che consentono di installare solo gli strumenti necessari. Le dimensioni di installazione indicate per i componenti elencati nell'interfaccia utente del programma di installazione non sono corrette e sottovalutano le dimensioni totali.

Per creare progetti Win32 nel carico di lavoro per desktop C++, è necessario installare un set di strumenti e un SDK Windows. Installare i componenti consigliati (selezionati) Set di strumenti VC++ 2017 versione 141 (x86, x64) e Windows 10 SDK (10.0.nnnnn) per garantire il funzionamento. Se gli strumenti necessari non sono installati, i progetti non verranno creati correttamente e la procedura guidata smette di rispondere.

Visual Studio 2017 versione 15.5

Gli strumenti di compilazione di Visual C++ (in precedenza disponibili come prodotto autonomo) sono ora inclusi come carico di lavoro nel programma di installazione di Visual Studio. Questo carico di lavoro installa solo gli strumenti necessari per compilare progetti C++ senza installare l'IDE di Visual Studio. Sono inclusi entrambi i set di strumenti v140 e v141. Il set di strumenti versione 141 contiene i miglioramenti più recenti di Visual Studio 2017 versione 15.5. Per altre informazioni, vedere Visual Studio Build Tools now include the VS2017 and VS2015 MSVC Toolset (Gli strumenti di compilazione di Visual Studio ora includono i set di strumenti MSVC di VS2017 e VS2015).

Sviluppo di applicazioni Linux con C++

L'estensione comune Visual C++ for Linux Development ora fa parte di Visual Studio. Questa installazione include tutto il necessario per lo sviluppo e il debug di applicazioni C++ in esecuzione in un ambiente Linux.

Visual Studio 2017 versione 15.2

Sono stati apportati miglioramenti alla condivisione del codice multipiattaforma e alla visualizzazione dei tipi. Per altre informazioni vedere, Linux C++ improvements for cross-platform code sharing and type visualization (Miglioramenti di Linux C++ per la condivisione del codice tra piattaforme e per la visualizzazione dei tipi).

Visual Studio 2017 versione 15.5
  • Il carico di lavoro Linux ha aggiunto il supporto per rsync come alternativa a sftp per la sincronizzazione dei file in computer Linux remoti.
  • È stato aggiunto il supporto per la compilazione trasversale mirata ai microcontroller ARM. Per abilitarlo durante l'installazione, scegliere il carico di lavoro Sviluppo di applicazioni Linux con C++ e selezionare l'opzione Sviluppo incorporato e IoT. Questa opzione aggiunge gli strumenti di compilazione incrociata ARM GCC e Make all'installazione. Per altre informazioni, vedere ARM GCC Cross Compilation in Visual Studio (Compilazione incrociata GCC ARM in Visual Studio).
  • Supporto aggiunto per CMake. È ora possibile lavorare sulla base di codice CMake esistente senza la necessità di convertirlo in un progetto di Visual Studio. Per altre informazioni, vedereConfigurare un progetto CMake Linux.
  • Supporto aggiunto per l'esecuzione di attività remote. Questa funzionalità consente di eseguire qualsiasi comando in un sistema remoto definito nella Gestione connessioni di Visual Studio. Le attività remote consentono anche di copiare i file nel sistema remoto. Per altre informazioni, vedereConfigurare un progetto CMake Linux.
Visual Studio 2017 versione 15.7

Sviluppo di giochi con C++

Usare tutta la potenza di C++ per compilare giochi professionali con tecnologia DirectX o Cocos2d.

Sviluppo di dispositivi mobili con C++ per Android e iOS

Usando Visual Studio è ora possibile creare app per dispositivi mobili destinate ad Android e iOS ed eseguirne il debug.

App di Windows universale

C++ viene fornito come componente facoltativo del carico di lavoro per lo sviluppo di app di Windows universale. Attualmente, è necessario aggiornare manualmente i progetti C++. È possibile aprire un progetto di piattaforma UWP (Universal Windows Platform) di destinazione v140 in Visual Studio 2017. Tuttavia, è necessario selezionare il set di strumenti della piattaforma v141 nelle pagine delle proprietà del progetto se Visual Studio 2015 non è installato.

Nuove opzioni per C++ nella piattaforma UWP (Universal Windows Platform)

Sono ora disponibili nuove opzioni per la scrittura e la creazione di pacchetti di applicazioni C++ per il piattaforma UWP (Universal Windows Platform) e Windows Store: l'infrastruttura Desktop Bridge consente di creare un pacchetto dell'applicazione desktop o dell'oggetto COM esistente per la distribuzione tramite Windows Store. In alternativa, per la distribuzione tramite i canali esistenti tramite il sideload. Nuove funzionalità in Windows 10 consentono di aggiungere funzionalità della piattaforma UWP all'applicazione desktop in vari modi. Per altre informazioni, vedere Desktop Bridge.

Visual Studio 2017 versione 15.5

È stato aggiunto un modello di Progetto di creazione di pacchetti di applicazioni Windows che semplifica notevolmente la creazione di pacchetti di applicazioni desktop con Desktop Bridge. È disponibile in File > Nuovo > Progetto > Installati > Visual C++ > Piattaforma UWP. Per altre informazioni, vedere Creare un pacchetto dell'app con Visual Studio (Desktop Bridge).

Quando si scrive nuovo codice, ora è possibile usare C++/WinRT, una proiezione standard del linguaggio C++ per Windows Runtime implementata esclusivamente nei file di intestazione. Consente di usare e creare API di Windows Runtime usando qualsiasi compilatore C++ conforme agli standard. C++/WinRT è progettato per offrire agli sviluppatori C++ un accesso di prima classe all'API Windows moderna. Per altre informazioni, vedi C++/WinRT.

A partire dalla build 17025 di Windows SDK Insider Preview, C++/WinRT è incluso in Windows SDK. Per altre informazioni, vedere C++/WinRT is now included the Windows SDK (C++/WinRT ora incluso in Windows SDK).

Set di strumenti della piattaforma Clang/C2

Il set di strumenti Clang/C2 fornito con Visual Studio 2017 supporta ora il commutatore, fondamentale per la /bigobj compilazione di progetti di grandi dimensioni. Include anche diverse importanti correzioni di bug, sia nel front-end del compilatore che nel back-end.

Analisi del codice C++

I controlli di base per C++ per l'applicazione delle C++ Core Guidelines (Linee guida di base per C++) ora sono distribuiti con Visual Studio. Abilitare i controlli nella pagina Estensioni analisi codice nelle pagine delle proprietà del progetto. Le estensioni vengono quindi incluse quando si esegue l'analisi del codice. Per altre informazioni, vedere Using the C++ Core Guidelines checkers (Uso dei controlli delle linee guida di base per C++).

Screenshot della finestra di dialogo Pagine delle proprietà che mostra l'opzione Analisi codice di > configurazione Generale > selezionata e una serie di controlli di base elencati nella sezione Esegui questo set di regole.

Visual Studio 2017 versione 15.3
  • È stato aggiunto il supporto delle regole correlate alla gestione delle risorse.
Visual Studio 2017 versione 15.5
  • I nuovi controlli delle linee guida di base di C++ riguardano la correttezza del puntatore intelligente, l'uso corretto degli inizializzatori globali e l'uso di flag per i costrutti come goto e cast non corretti.

  • Alcuni numeri di avviso che potresti trovare nella versione 15.3 non sono più disponibili nella versione 15.5. Questi avvisi sono stati sostituiti con controlli più specifici.

Visual Studio 2017 versione 15.6
Visual Studio 2017 versione 15.7
  • Aggiunta del supporto per /analyze:ruleset, che consente di specificare le regole di analisi del codice da eseguire.
  • Aggiunta del supporto per altre regole delle linee guida di base di C++. Per altre informazioni, vedere Using the C++ Core Guidelines checkers (Uso dei controlli delle linee guida di base per C++).

Unit test in Visual Studio 2017

Visual Studio 2017 versione 15.5

Google Test Adapter e Boost.Test Adapter sono ora disponibili come componenti del carico di lavoro Sviluppo desktop con C++ . Sono integrati con Esplora test. Il supporto CTest viene aggiunto per i progetti CMake (usando Open Folder), anche se l'integrazione completa con Esplora test non è ancora disponibile. Per altre informazioni, vedere Scrittura di unit test per C/C++.

Visual Studio 2017 versione 15.6
  • Aggiunta del supporto per Boost.Test la libreria dinamica.
  • Un Boost.Test modello di elemento è ora disponibile nell'IDE.

Per altre informazioni, vedere Boost.Test Unit Testing: supporto della libreria dinamica e Nuovo modello di elemento.

Visual Studio 2017 versione 15.7

Aggiunto il supporto di CodeLens per progetti di unit test C++. Per altre informazioni, vedere Announcing CodeLens for C++ Unit Testing (Annuncio di CodeLens per unit test C++).

Diagnostica della grafica di Visual Studio

Strumenti di diagnostica della grafica di Visual Studio: è possibile usarli per registrare e analizzare i problemi di rendering e prestazioni nelle app Direct3D. Usarli nelle app eseguite localmente nel PC Windows, in un emulatore di dispositivo Windows o in un PC o in un dispositivo remoto.

  • Input e output per vertex shader e geometry shader: la possibilità di visualizzare input e output di vertex shader e geometry shader è stata una delle funzionalità più richieste. È ora supportato negli strumenti. Selezionare la fase VS o GS nella visualizzazione Fasi pipeline per iniziare a esaminare l'input e l'output nella tabella seguente.

    Input/Output per shader.

  • Ricerca e filtro nella tabella degli oggetti: un modo rapido e semplice per individuare le risorse che si stanno cercando.

    Screenshot della sezione Tabella oggetti con l'elenco a discesa Tipo e la casella di testo Cerca evidenziata.

  • Cronologia risorse: consente di visualizzare con facilità l'intera cronologia delle modifiche di una risorsa usata durante il rendering di un frame acquisito. Per richiamare la cronologia per qualsiasi risorsa, fare clic sull'icona dell'orologio accanto a un collegamento ipertestuale a qualsiasi risorsa.

    Cronologia risorse.

    Viene visualizzata la nuova finestra dello strumento Cronologia risorse, popolata con la cronologia delle modifiche della risorsa.

    Modifica della cronologia delle risorse.

    È possibile acquisire fotogrammi con acquisizione completa dello stack di chiamate abilitata. Ciò consente di dedurre rapidamente il contesto di ogni evento di modifica e di esaminarlo all'interno del progetto di Visual Studio. Impostare l'opzione di acquisizione dello stack completo nella finestra di dialogo Opzioni degli strumenti > di Visual Studio in Diagnostica grafica.

  • Statistiche API: consente di visualizzare un riepilogo dettagliato dell'utilizzo dell'API nel frame. È utile per scoprire le chiamate che potresti non rendersi conto che stai effettuando affatto, o chiamate che stai facendo troppo spesso. Questa finestra è disponibile tramite Visualizza > statistiche API in Visual Studio Graphics Analyzer.

    Statistiche API.

  • Statistiche memoria: consente di visualizzare la quantità di memoria allocata dal driver per le risorse create nel frame. Questa finestra è disponibile tramite Visualizza > statistiche di memoria in Visual Studio Graphics Analyzer. Per copiare i dati in un file CSV per la visualizzazione in un foglio di calcolo, fare clic con il pulsante destro del mouse e scegliere Copia tutto.

    Statistiche di memoria.

  • Convalida frame: il nuovo elenco di errori e avvisi consente di spostarsi con facilità nell'elenco di eventi in base a potenziali problemi rilevati dal livello di debug Direct3D. Fare clic su Visualizza > convalida dei fotogrammi in Visual Studio Graphics Analyzer per aprire la finestra. Quindi fare clic su Esegui convalida per avviare l'analisi. L'operazione può richiedere alcuni minuti, a seconda della complessità del frame.

    Convalida dei fotogrammi.

  • Analisi dei fotogrammi per D3D12: usare l'analisi dei fotogrammi per analizzare le prestazioni delle chiamate di disegno con esperimenti di simulazione diretti. Passare alla scheda Analisi dei frame ed eseguire l'analisi per visualizzare il report.

    Analisi dei fotogrammi.

  • Miglioramenti all'utilizzo della GPU: le tracce aperte possono essere acquisite tramite il profiler utilizzo GPU di Visual Studio con GPUView o lo strumento Windows analizzatore prestazioni (WPA) per un'analisi più dettagliata. Se è installato Windows Performance Toolkit, sono presenti due collegamenti ipertestuali: uno per WPA e un altro per GPUView, nella parte inferiore destra della panoramica della sessione.

    Utilizzo della GPU.

    Le tracce aperte in GPUView tramite questo collegamento supportano lo zoom e la panoramica sincronizzati della sequenza temporale vs e GPUView. Una casella di controllo in Visual Studio controlla se la sincronizzazione è abilitata o meno.

    GPUView.