Bagikan melalui


Yang baru untuk C++ di Visual Studio 2017

Visual Studio 2017 menghadirkan banyak pembaruan dan perbaikan untuk lingkungan C++. Kami telah memperbaiki lebih dari 250 bug dan melaporkan masalah dalam pengompilasi dan alat. Banyak dari masalah ini dikirimkan oleh pelanggan melalui opsi Laporkan Masalah dan Berikan Saran di bagian Kirim Umpan Balik. Terima kasih telah melaporkan bug!

Untuk informasi selengkapnya mengenai apa yang baru di semua Visual Studio, kunjungi Yang baru di Visual Studio 2017. Untuk informasi yang baru untuk C++ di Visual Studio 2019, lihat Yang baru untuk C++ di Visual Studio 2019. Untuk informasi yang baru untuk C++ di Visual Studio 2015 dan versi yang lebih lama, lihat Visual C++ Yang Baru pada 2003 hingga 2015. Untuk informasi mengenai apa yang baru dalam dokumen C++, lihat Dokumen Microsoft C++: Yang baru.

Pengompilasi Visual Studio C++ 2017

Peningkatan kesesuaian C++

Kami telah memperbarui pengompilasi C++ dan pustaka standar dalam rilis ini dengan dukungan yang ditingkatkan untuk fitur C++11 dan C++14. Ini juga termasuk dukungan awal untuk fitur tertentu yang diharapkan ada dalam standar C++17. Untuk informasi terperinci, lihat Penyempurnaan Kesesuaian C++ di Visual Studio 2017.

Visual Studio 2017 versi 15.5

Pengompilasi mendukung sekitar 75% fitur yang baru di C++17, termasuk pengikatan terstruktur, constexpr lambda, if constexpr, variabel sebaris, ekspresi lipatan, dan penambahan noexcept ke sistem jenis. Fitur-fitur ini tersedia di bagian opsi /std:c++17. Untuk informasi selengkapnya, lihat Penyempurnaan Kesesuaian C++ di Visual Studio 2017

Visual Studio 2017 versi 15.7

Toolset pengompilasi MSVC di Visual Studio versi 15.7 sekarang sesuai dengan Standar C++. Untuk informasi selengkapnya, lihat Mengumumkan: Kesesuaian MSVC dengan kesesuaian bahasa Standar C++ dan Microsoft C/C++.

Visual Studio 2017 versi 15.8

Switch pengompilasi /experimental:preprocessor memungkinkan praprosesor MSVC eksperimental baru yang akhirnya akan sesuai dengan semua standar C dan C++ yang berlaku. Untuk informasi selengkapnya, lihat Gambaran umum praprosesor baru MSVC.

Opsi pengompilasi baru

  • /permissive-: Aktifkan semua opsi pengompilasi kesesuaian standar yang ketat dan nonaktifkan sebagian besar ekstensi pengompilasi khusus Microsoft (tetapi tidak __declspec(dllimport), misalnya). Opsi ini aktif secara default di Visual Studio 2017 versi 15.5. Mode kesesuaian /permissive- mencakup dukungan untuk pencarian nama dua fase. Untuk informasi selengkapnya, lihat Peningkatan Kesesuaian C++ di Visual Studio.

  • /diagnostics: Mengaktifkan tampilan kesalahan diagnostik atau lokasi peringatan dengan tiga cara berbeda: hanya nomor baris, nomor baris dan kolom, atau nomor baris dan kolom, dengan tanda sisipan di bawah baris kode yang salah.

  • /debug:fastlink: Aktifkan hingga 30% waktu tautan bertambah bertahap yang lebih cepat (vs. Visual Studio 2015) dengan tidak menyalin semua informasi debug ke dalam file PDB. File PDB sebagai gantinya menunjuk ke informasi debug untuk file objek dan pustaka yang digunakan untuk membuat file yang dapat dieksekusi. Lihat Siklus build C++ yang lebih cepat di VS "15" dengan /Debug:fastlink dan Rekomendasi untuk mempercepat build C++ di Visual Studio.

  • Visual Studio 2017 memungkinkan penggunaan /sdl dengan /await. Kami menghapus batasan /RTC dengan Coroutine.

Visual Studio 2017 versi 15.3
  • /std:c++14 dan /std:c++latest: Opsi pengompilasi ini memungkinkan Anda untuk mengaktifkan versi tertentu dari bahasa pemrograman ISO C++ dalam proyek. Sebagian besar fitur standar draf baru dilindungi oleh opsi /std:c++latest.

  • /std:c++17 memungkinkan serangkaian fitur C++17 yang diimplementasikan oleh pengompilasi. Opsi ini menonaktifkan dukungan pustaka standar dan pengompilasi untuk fitur setelah C++17: yang diubah atau baru di versi Draf Kerja yang lebih baru, dan pembaruan cacat dari Standar C++. Untuk mengaktifkan fitur-fitur tersebut, gunakan /std:c++latest.

Codegen, keamanan, diagnostik, dan penerapan versi

Rilis ini menghadirkan beberapa peningkatan dalam optimalisasi, pembuatan kode, penerapan versi toolset, dan diagnostik. Beberapa peningkatan penting meliputi:

  • Peningkatan pembuatan kode perulangan: Dukungan untuk vektorisasi otomatis pembagian bilangan bulat konstan, identifikasi pola memset yang lebih baik.
  • Keamanan kode yang ditingkatkan: Peningkatan emisi diagnostik pengompilasi overrun buffer, dan /guard:cf sekarang melindungi pernyataan switch yang menghasilkan tabel lompat.
  • Penerapan versi: Nilai makro praprosesor bawaan _MSC_VER sekarang sedang diperbarui secara monoton di setiap pembaruan toolset Visual C++. Untuk informasi selengkapnya, lihat Versi Pengompilasi Visual C++.
  • Tata letak toolset baru: Alat pengompilasi dan build terkait memiliki lokasi dan struktur direktori baru pada mesin pengembangan Anda. Tata letak baru memungkinkan penginstalan berdampingan dari beberapa versi pengompilasi. Untuk informasi selengkapnya, lihat Tata Letak Alat Pengompilasi di Visual Studio 2017.
  • Diagnostik yang ditingkatkan: Jendela output sekarang menunjukkan kolom tempat kesalahan terjadi. Untuk informasi selengkapnya, lihat Peningkatan diagnostik pengompilasi C++ di Pratinjau Vs "15" 5.
  • Saat menggunakan koroutine, hasil kata kunci eksperimental (tersedia di bawah /await opsi) dihapus. Kode Anda harus diperbarui untuk menggunakan co_yield sebagai gantinya. Untuk informasi selengkapnya, lihat kata kunci yield untuk menjadi co_yield di VS 2017.
Visual Studio 2017 versi 15.3

Peningkatan diagnostik dalam pengkompilasi. Untuk informasi selengkapnya, lihat Peningkatan Diagnostik di Visual Studio 2017 15.3.0.

Visual Studio 2017 versi 15.5

Performa runtime Visual C++ terus meningkat melalui kualitas kode yang dihasilkan dengan lebih baik. Sekarang Anda hanya dapat mengompilasi ulang kode Anda, dan aplikasi Anda berjalan lebih cepat. Beberapa optimalisasi pengompilasi baru, seperti vektorisasi penyimpanan skalar kondisional, menggabungkan panggilan sin(x) dan cos(x) ke sincos(x) baru, serta penghapusan instruksi redundan dari pengoptimal SSA. Optimalisasi pengompilasi lainnya adalah peningkatan fungsionalitas yang ada, seperti: heuristik vektorizer untuk ekspresi kondisional, optimalisasi perulangan yang lebih baik, dan codegen float min/maks. Penaut memiliki implementasi /OPT:ICF baru dan lebih cepat, yang dapat menghasilkan kecepatan waktu tautan hingga 9%, dan ada perbaikan perf lainnya dalam penautan bertahap. Untuk informasi selengkapnya, lihat /OPT (Optimasi) dan /INCREMENTAL (Tautan Bertahap).

Pengompilasi Microsoft C++ mendukung AVX-512 Intel. Pengompilasi ini memiliki instruksi Panjang Vektor yang membawa fungsi baru di AVX-512 ke register lebar 128-bit dan 256-bit.

Opsi /Zc:noexceptTypes- dapat digunakan untuk kembali ke versi C++14 noexcept saat menggunakan mode C++17 secara umum. Opsi ini memungkinkan Anda memperbarui kode sumber agar sesuai dengan C++17 tanpa harus menulis ulang semua kode throw() Anda secara bersamaan. Untuk informasi selengkapnya, lihat Penghapusan spesifikasi pengecualian dinamis dan noexcept.

Visual Studio 2017 versi 15.7

Pustaka standar C++

Peningkatan Kebenaran

Visual Studio RTM 2017 (versi 15.0)
  • Peningkatan diagnostik kecil basic_string _ITERATOR_DEBUG_LEVEL != 0 . Ketika pemeriksaan IDL tersandung dalam mesin string, sekarang ia melaporkan perilaku spesifik yang menyebabkan perjalanan. Misalnya, alih-alih "iterator string tidak dapat didereferensikan" Anda mendapatkan "tidak dapat membatalkan dereferensi string iterator karena berada di luar rentang (misalnya iterator akhir)".
  • Memperbaiki operator penetapan pemindahan std::promise, yang sebelumnya dapat menyebabkan kode diblokir selamanya.
  • Memperbaiki kesalahan pengompilasi dengan konversi implisit atomic<T*> ke T*.
  • pointer_traits<Ptr> sekarang mendeteksi Ptr::rebind<U>dengan benar.
  • Memperbaiki pengualifikasi const yang hilang di operator pengurangan move_iterator.
  • Memperbaiki codegen buruk senyap untuk alokator stateful yang ditentukan pengguna yang meminta propagate_on_container_copy_assignment dan propagate_on_container_move_assignment.
  • atomic<T> sekarang mentolerir kelebihan beban operator&().
  • Diagnostik pengompilasi yang sedikit ditingkatkan untuk kesalahan panggilan bind().

Ada lebih banyak peningkatan pustaka standar di Visual Studio 2017 RTM. Untuk daftar lengkapnya, lihat entri Blog Tim C++ Perbaikan Pustaka Standar Di VS 2017 RTM.

Visual Studio 2017 versi 15.3
  • Kontainer pustaka standar sekarang mengaitkan max_size() ke numeric_limits<difference_type>::max() daripada max() dari size_type. Perubahan ini memastikan bahwa hasil distance() pada iterator dari kontainer tersebut dapat direpresentasikan dalam jenis pengembalian distance().
  • Memperbaiki spesialisasi auto_ptr<void> yang hilang.
  • Algoritma for_each_n(), generate_n(), dan search_n() sebelumnya gagal dikompilasi jika argumen panjang bukan jenis integral. Mereka sekarang mencoba untuk mengonversi panjang nonintegral ke iterator' difference_type.
  • normal_distribution<float> tidak lagi memancarkan peringatan di dalam pustaka standar tentang mempersempit dari ganda ke float.
  • Memperbaiki beberapa operasi basic_string yang menggunakan npos alih-alih max_size() saat memeriksa luapan ukuran maksimum.
  • condition_variable::wait_for(lock, relative_time, predicate) akan menunggu seluruh waktu relatif jika ada pengaktifan palsu. Sekarang hanya menunggu interval tunggal dari waktu relatif.
  • future::get() sekarang membatalkan future, sesuai kebutuhan standar.
  • iterator_traits<void *> dulu merupakan kesalahan yang sulit karena mencoba membentuk void&; sekarang dengan bersih menjadi struktur kosong untuk memungkinkan penggunaan iterator_traits dalam kondisi SFINAE "is iterator".
  • Beberapa peringatan yang dilaporkan oleh Clang -Wsystem-headers diperbaiki.
  • Juga memperbaiki "spesifikasi pengecualian dalam deklarasi tidak cocok dengan deklarasi sebelumnya" yang dilaporkan oleh Clang -Wmicrosoft-exception-spec.
  • Juga memperbaiki peringatan pengurutan mem-initializer-list yang dilaporkan oleh Clang dan C1XX.
  • Kontainer yang tidak diurutkan tidak menukar fungsi hash atau predikat mereka ketika kontainer itu sendiri ditukar. Sekarang dilakukan.
  • Banyak operasi pertukaran kontainer sekarang ditandai noexcept (karena pustaka standar kami tidak pernah berniat untuk melemparkan pengecualian saat mendeteksi kondisi perilaku tidak terdefinisi non-propagate_on_container_swap nonalokator yang tidak sama).
  • Banyak operasi vector<bool> sekarang ditandai noexcept.
  • Pustaka standar sekarang memberlakukan alokator value_type yang cocok (dalam mode C++17) dengan penetasan escape opt-out.
  • Memperbaiki beberapa kondisi di mana sisipan rentang mandiri pada basic_string akan mengacak konten string. (Catatan: penyisipan rentang mandiri ke vektor masih dilarang oleh Standar.)
  • basic_string::shrink_to_fit() tidak lagi terpengaruh oleh propagate_on_container_swap alokator.
  • std::decay sekarang menangani jenis fungsi yang dapat diubah, yaitu, jenis fungsi yang memenuhi syarat cv, memenuhi syarat ref, atau keduanya.
  • Perubahan termasuk arahan untuk menggunakan sensitivitas huruf besar/kecil yang benar dan garis miring ke depan, meningkatkan portabilitas.
  • Memperbaiki peringatan C4061 "enumerator 'enumerator' dalam sakelar enum 'enumerasi' tidak ditangani secara eksplisit oleh label kasus." Peringatan ini off-by-default dan diperbaiki sebagai pengecualian untuk kebijakan umum pustaka standar untuk peringatan. (Pustaka standar /W4 bersih, tetapi tidak mencoba untuk /Wall bersih. Banyak peringatan nonaktif secara default yang luar biasa mengganggu, dan tidak dimaksudkan untuk digunakan secara teratur.)
  • Peningkatan pemeriksaan debug std::list. Iterator daftar sekarang memeriksa operator->(), dan list::unique() sekarang menandai iterator sebagai tidak valid.
  • Perbaikan metaprogram alokator penggunaan di tuple.
Visual Studio 2017 versi 15.5
  • std::partition sekarang memanggil predikat N kali alih-alih N + 1 kali, seperti yang diperlukan standar.
  • Upaya untuk menghindari statis ajaib di versi 15.3 diperbaiki dalam versi 15.5.
  • std::atomic<T> tidak lagi perlu T untuk dapat dibangun secara default.
  • Algoritma tumpukan yang mengambil waktu logaritma bertingkah berbeda ketika debugging iterator diaktifkan. Algoritma ini tidak lagi melakukan pernyataan waktu linier bahwa input sebenarnya adalah tumpukan.
  • __declspec(allocator) sekarang dilindungi hanya untuk C1XX, untuk mencegah peringatan dari Clang, yang tidak memahami declspec ini.
  • basic_string::npos sekarang tersedia sebagai konstanta waktu kompilasi.
  • std::allocator dalam mode C++17 sekarang menangani alokasi jenis yang terlalu sejajar dengan benar, yaitu jenis yang penyelarasannya lebih besar dari max_align_t, kecuali dinonaktifkan oleh /Zc:alignedNew-. Misalnya, vektor objek dengan penyelarasan 16-byte atau 32-byte sekarang diselaraskan dengan benar untuk instruksi SSE dan AVX.

Peningkatan kesesuaian

  • Kami menambahkan <any>, <string_view>, apply(), make_from_tuple().
  • Menambahkan <optional>, <variant>, shared_ptr::weak_type, dan <cstdalign>.
  • Mengaktifkan C++14 constexpr di min(initializer_list), max(initializer_list), dan minmax(initializer_list), dan min_element(), max_element(), serta minmax_element().

Untuk informasi selengkapnya, lihat Kesesuaian bahasa Microsoft C/C++.

Visual Studio 2017 versi 15.3
  • Beberapa fitur C++17 lainnya telah diimplementasikan. Untuk informasi selengkapnya, lihat Tabel kesesuaian bahasa Microsoft C/C++.
  • Mengimplementasikan P0602R0 "varian dan opsional harus menyebarkan salinan/pemindahan sepele".
  • Pustaka standar sekarang secara resmi mentolerir RTTI dinamis yang dinonaktifkan melalui opsi /GR-. Baik dynamic_pointer_cast() dan rethrow_if_nested() secara inheren memerlukan dynamic_cast, sehingga pustaka standar sekarang menandainya sebagai =delete di bawah /GR-.
  • Bahkan ketika RTTI dinamis dinonaktifkan melalui /GR-, "RTTI statis" dalam bentuk typeid(SomeType) masih tersedia, dan mendukung beberapa komponen pustaka standar. Pustaka standar sekarang mendukung penonaktifan fitur ini juga, melalui /D_HAS_STATIC_RTTI=0. Bendera ini juga menonaktifkan std::any, fungsi anggota target() dan target_type() dari std::function, serta fungsi anggota teman get_deleter() dari std::shared_ptr dan std::weak_ptr.
  • Pustaka standar sekarang menggunakan C++14 constexpr tanpa syarat, alih-alih makro yang ditentukan secara kondisional.
  • Pustaka standar sekarang menggunakan templat alias secara internal.
  • Pustaka standar sekarang menggunakan nullptr secara internal, bukan nullptr_t{}. (Penggunaan internal NULL diberantas. Penggunaan internal 0-as-null sedang dibersihkan secara bertahap.)
  • Pustaka standar sekarang menggunakan std::move() secara internal, alih-alih menyalahgunakan gaya std::forward().
  • Mengubah static_assert(false, "message") menjadi #error message. Perubahan ini meningkatkan diagnostik pengompilasi karena #error segera menghentikan kompilasi.
  • Pustaka standar tidak lagi menandai fungsi sebagai __declspec(dllimport). Teknologi penaut modern tidak lagi memerlukannya.
  • Mengekstrak SFINAE ke argumen templat default, yang mengurangi kekacauan dibandingkan dengan jenis pengembalian dan jenis argumen fungsi.
  • Pemeriksaan debug <secara acak> sekarang menggunakan mesin pustaka standar yang biasa, alih-alih fungsi internal _Rng_abort(), yang memanggil fputs() ke stderr. Implementasi fungsi ini disimpan untuk kompatibilitas biner. Kami akan menghapusnya di versi pustaka standar yang tidak kompatibel dengan biner berikutnya.
Visual Studio 2017 versi 15.5
  • Beberapa fitur pustaka standar telah ditambahkan, tidak digunakan lagi, atau dihapus sesuai standar C++17. Untuk informasi selengkapnya, lihat Peningkatan kesesuaian C++ di Visual Studio.
  • Dukungan eksperimental untuk algoritma paralel berikut:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • Tanda tangan untuk algoritma paralel berikut ditambahkan tetapi tidak diparalelkan saat ini. Pembuatan profil tidak menunjukkan manfaat dalam paralelisasi algoritma yang hanya memindahkan atau memutus elemen:
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017 versi 15.6
  • <memory_resource>
  • Dasar-Dasar Pustaka V1
  • Menghapus penetapan polymorphic_allocator
  • Meningkatkan pengurangan argumen templat kelas
Visual Studio 2017 versi 15.7
  • Dukungan untuk algoritma paralel tidak lagi bersifat eksperimental
  • Implementasi baru <filesystem>
  • Konversi string dasar (parsial)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • Menghindari kerusakan yang tidak perlu
  • Fungsi khusus matematika
  • constexpr char_traits
  • Panduan pengurangan untuk pustaka standar

Untuk informasi selengkapnya, lihat Kesesuaian bahasa Microsoft C/C++.

Perbaikan performa dan throughput

  • Memngkinkan kelebihan beban basic_string::find(char) hanya memanggil traits::find sekali. Sebelumnya, ini diimplementasikan sebagai pencarian string umum untuk string panjang 1.
  • basic_string::operator== sekarang memeriksa ukuran string sebelum membandingkan konten string.
  • Menghapus kopling kontrol di basic_string, yang sulit dianalisis oleh pengoptimal pengompilasi. Untuk semua string pendek, panggilan reserve masih memiliki biaya bukan nol untuk tidak melakukan apa-apa.
  • std::vector dirombongkan untuk kebenaran dan performa: aliasing selama operasi penyisipan dan penempatan sekarang ditangani dengan benar seperti yang diperlukan oleh Standar, jaminan pengecualian yang kuat sekarang disediakan ketika diperlukan oleh Standar melalui move_if_noexcept() dan logika lainnya, dan menyisipkan dan emplace melakukan lebih sedikit operasi elemen.
  • Pustaka standar C++ sekarang menghindari dereferensi pointer null fancy.
  • Peningkatan performa weak_ptr::lock().
  • Untuk meningkatkan throughput pengompilasi, header pustaka standar C++ sekarang menghindari termasuk deklarasi untuk intrinsik pengompilasi yang tidak perlu.
  • Peningkatan performa std::string dan std::wstring memindahkan konstruktor lebih dari tiga kali.
Visual Studio 2017 versi 15.3
  • Bekerja di sekitar interaksi dengan noexcept, yang mencegah penyejajaran implementasi std::atomic ke dalam fungsi yang menggunakan Structured Exception Handling (SEH).
  • Mengubah fungsi internal _Deallocate() pustaka standar untuk dioptimalkan menjadi kode yang lebih kecil, memungkinkannya untuk disejajarkan ke lebih banyak tempat.
  • Mengubah std::try_lock() untuk menggunakan perluasan paket alih-alih pengulangan.
  • Meningkatkan std::lock() algoritma penghindaran kebuntuan untuk menggunakan operasi lock() alih-alih memutar try_lock() pada semua kunci.
  • Mengaktifkan Optimalisasi Nilai Pengembalian Bernama di system_category::message().
  • conjunction dan disjunction sekarang membuat instans jenis N + 1, bukan jenis 2N + 2.
  • std::function tidak lagi membuat instans mesin dukungan alokator untuk setiap jenis yang dapat dipanggil, meningkatkan throughput dan mengurangi ukuran .obj dalam program yang meneruskan banyak lambda yang berbeda ke std::function.
  • allocator_traits<std::allocator> berisi operasi std::allocator yang disisipkan secara manual, mengurangi ukuran kode dalam kode yang hanya berinteraksi dengan std::allocator hingga allocator_traits (yaitu, di sebagian besar kode).
  • Antarmuka alokator minimal C++11 sekarang ditangani oleh panggilan pustaka standar allocator_traits secara langsung, alih-alih membungkus alokator di kelas internal _Wrap_alloc. Perubahan ini mengurangi ukuran kode yang dihasilkan untuk dukungan alokator, meningkatkan kemampuan pengoptimal untuk alasan tentang kontainer pustaka standar dalam beberapa kasus, dan memberikan pengalaman debugging yang lebih baik (seperti sekarang Anda melihat jenis alokator Anda, dibandingkan _Wrap_alloc<your_allocator_type> di debugger).
  • Pemrograman meta yang dihapus untuk allocator::reference yang disesuaikan, yang alokatornya tidak diizinkan untuk disesuaikan. (Alokator dapat membuat kontainer menggunakan pointer fancy tetapi bukan referensi fancy.)
  • Front end pengompilasi diajarkan untuk membuka iterator debug dalam basis rentang untuk perulangan, meningkatkan performa build debug.
  • Jalur penyusutan internal basic_string untuk shrink_to_fit() dan reserve() tidak lagi berada di jalur operasi realokasi, mengurangi ukuran kode untuk semua anggota yang bermutasi.
  • Jalur pertumbuhan internal basic_string tidak lagi berada di jalur shrink_to_fit().
  • Operasi basic_string yang bermutasi sekarang diperhitungkan ke jalur cepat yang tidak dialokasikan dan mengalokasikan fungsi jalur lambat, sehingga lebih mungkin untuk kasus tanpa realokasi umum untuk disandingkan ke pemanggil.
  • Operasi yang bermutasi basic_string sekarang membangun buffer yang direalokasikan dalam keadaan pilihan daripada mengubah ukuran di tempat. Misalnya, sisipan di awal string sekarang memindahkan konten setelah penyisipan tepat sekali. Ini dipindahkan ke bawah atau ke buffer yang baru dialokasikan. Ini tidak lagi dipindahkan dua kali dalam kasus realokasi, pertama ke buffer yang baru dialokasikan dan kemudian turun.
  • Operasi yang memanggil pustaka standar C dalam <string> sekarang meng-cache alamat errno untuk menghapus interaksi berulang dengan TLS.
  • Menyederhanakan implementasi is_pointer.
  • Selesai mengubah SFINAE Ekspresi berbasis fungsi ke berbasis struct dan void_t.
  • Algoritma pustaka standar sekarang menghindari iterator pascainkrementasi.
  • Memperbaiki peringatan pemotongan saat menggunakan alokator 32-bit pada sistem 64-bit.
  • Penetapan pemindahan std::vector sekarang lebih efisien dalam kasus non-equal-allocator non-POCMA, dengan menggunakan kembali buffer jika memungkinkan.
Visual Studio 2017 versi 15.5
  • basic_string<char16_t> sekarang melibatkan memcmp, memcpy, yang sama, dan optimalisasi serupa yang dilakukan basic_string<wchar_t>.
  • Batasan pengoptimal yang mencegah pointer fungsi disejajarkan, diekspos oleh pekerjaan "hindari fungsi penyalinan" kami di Visual Studio 2015 Pembaruan 3, telah diatasi, memulihkan performa lower_bound(iter, iter, function pointer).
  • Overhead verifikasi perintah debugging iterator untuk input includes, set_difference, set_symmetric_difference, dan set_union dikurangi dengan membuka iterator sebelum memeriksa perintah.
  • std::inplace_merge sekarang melompati elemen yang sudah berada di posisi.
  • Penyusunan std::random_device tidak lagi menyusun kemudian menghancurkan std::string.
  • std::equal dan std::partition memiliki pass pengoptimalan jump-threading yang menyimpan perbandingan iterator.
  • Ketika std::reverse diteruskan pointer untuk disalin Tsecara sepele, sekarang dikirim ke implementasi vektorisasi tulisan tangan.
  • std::fill, std::equal, dan std::lexicographical_compare diajarkan cara mengirimkan ke memset dan memcmp untuk std::byte dan gsl::byte (serta enum dan kelas enum seperti karakter lainnya). Karena std::copy dikirim menggunakan is_trivially_copyable, tidak memerlukan perubahan apa pun.
  • Pustaka standar tidak lagi berisi destruktor kurung kurawal kosong yang satu-satunya perilakunya adalah membuat jenis tidak dapat dihancurkan secara sepele.

Pustaka lainnya

Dukungan pustaka sumber terbuka

Vcpkg adalah alat baris perintah sumber terbuka yang sangat menyederhanakan proses memperoleh dan membangun pustaka statis C++ sumber terbuka dan DLLS di Visual Studio. Untuk informasi selengkapnya, lihat vcpkg.

CPPRest SDK 2.9.0

Visual Studio 2017 versi 15.5

CPPRestSDK, API web lintas platform untuk C++, diperbarui ke versi 2.9.0. Untuk informasi selengkapnya, lihat CppRestSDK 2.9.0 tersedia di GitHub.

ATL

Visual Studio 2017 versi 15.5
  • Set lain dari perbaikan kesesuaian pencarian nama
  • Konstruktor pemindahan yang ada dan operator penetapan pemindahan sekarang ditandai dengan benar sebagai nonthrowing
  • Membatalkan penekanan peringatan valid C4640 tentang init aman utas statis lokal di atlstr.h
  • Inisialisasi statis lokal yang aman utas secara otomatis dimatikan di toolset XP saat menggunakan ATL untuk membangun DLL. Sekarang tidak. Anda dapat menambahkan /Zc:threadSafeInit- di pengaturan Proyek jika Anda tidak ingin inisialisasi thread-safe.

Runtime Visual C++

  • Header baru "cfguard.h" untuk simbol Control Flow Guard.

Visual Studio 2017 C++ IDE

  • Performa perubahan konfigurasi sekarang lebih baik untuk proyek asli C++ dan jauh lebih baik untuk proyek C++/CLI. Ketika konfigurasi solusi diaktifkan untuk pertama kalinya, itu lebih cepat, dan semua aktivasi selanjutnya dari konfigurasi solusi ini hampir seketika.
Visual Studio 2017 versi 15.3
  • Beberapa wizard proyek dan kode telah ditulis ulang dalam gaya dialog tanda tangan.
  • Tambahkan Kelas sekarang meluncurkan wizard Tambahkan Kelas secara langsung. Semua item lain yang sebelumnya ada di sini sekarang tersedia di bawah Tambahkan > Item Baru.
  • Proyek Win32 sekarang berada di bawah kategori Windows Desktop dalam dialog Project Baru.
  • Templat Konsol Windows dan Aplikasi Desktop sekarang membuat proyek tanpa menampilkan wizard. Ada Wizard Desktop Windows baru di bawah kategori yang sama yang menampilkan opsi yang sama dengan wizard Aplikasi Konsol Win32 lama.
Visual Studio 2017 versi 15.5

Beberapa operasi C++ yang menggunakan mesin IntelliSense untuk refaktor dan navigasi kode berjalan jauh lebih cepat. Angka-angka berikut didasarkan pada solusi Visual Studio Chromium dengan 3500 proyek:

Fitur Peningkatan Performa
Ubah nama 5,3x
Mengubah Tanda Tangan 4,5x
Temukan Semua Referensi 4,7x

C++ sekarang mendukung Ctrl+Klik Buka Definisi, memudahkan navigasi mouse ke definisi. Structure Visualizer dari paket Productivity Power Tools sekarang juga disertakan dalam produk secara default.

IntelliSense

  • Mesin database berbasis SQLite baru sekarang digunakan secara default. Mesin baru mempercepat operasi database seperti Buka Definisi dan Temukan Semua Referensi. Hal ini meningkatkan waktu penguraian solusi awal secara signifikan. Pengaturan dipindahkan ke > Alat Opsi > Editor > Teks C/C++ > Tingkat Lanjut. (Sebelumnya di bagian ... C/C++ > Eksperimental.)

  • Kami telah meningkatkan performa IntelliSense pada proyek dan file yang tidak menggunakan header yang telah dikommpilasikan sebelumnya - Header Otomatis yang Telah Dikommpilasikan dibuat untuk header dalam file saat ini.

  • Kami telah menambahkan pemfilteran kesalahan dan bantuan untuk kesalahan IntelliSense dalam daftar kesalahan. Mengeklik kolom kesalahan sekarang memungkinkan pemfilteran. Selain itu, mengklik kesalahan tertentu atau menekan F1 meluncurkan pencarian online untuk pesan kesalahan.

    Daftar Kesalahan.

    Daftar Kesalahan Difilter.

  • Menambahkan kemampuan untuk memfilter item Daftar Anggota menurut jenis.

    Pemfilteran Daftar Anggota.

  • Menambahkan fitur IntelliSense Prediktif eksperimental baru yang menyediakan pemfilteran sadar kontekstual tentang apa yang muncul di Daftar Anggota. Untuk informasi selengkapnya, lihat C++ IntelliSense Improvements - Predictive IntelliSense & Filtering.

  • Temukan Semua Referensi (Shift+F12) sekarang membantu Anda mengeksplor dengan mudah, bahkan dalam basis kode yang kompleks. Fungsi ini menyediakan pengelompokan tingkat lanjut, pemfilteran, pengurutan, pencarian dalam hasil, dan (untuk beberapa bahasa) pewarnaan, sehingga Anda bisa mendapatkan pemahaman yang jelas tentang referensi Anda. Untuk C++, UI baru meliputi informasi tentang apakah kita membaca dari atau menulis ke variabel.

  • Fitur IntelliSense Dot-to-Arrow dipindahkan dari eksperimental ke tingkat lanjut, dan sekarang diaktifkan secara default. Editor ini menampilkan Perluas Cakupan dan Perluas Prioritas yang dipindahkan dari eksperimental ke tingkat lanjut.

  • Fitur refaktor eksperimental Ubah Tanda Tangan dan Fungsi Ekstrak sekarang tersedia secara default.

  • Menambahkan fitur eksperimental 'Beban proyek yang lebih cepat' untuk proyek C++. Pada waktu berikutnya dibuka, proyek C++ akan dimuat lebih cepat, dan setelahnya akan dimuat jauh lebih cepat!

  • Beberapa fitur ini umum untuk bahasa lain, dan beberapa khusus untuk C++. Untuk informasi selengkapnya tentang fitur baru ini, lihat Mengumumkan Pratinjau Visual Studio "15" 5.

Visual Studio 2017 versi 15.7

Proyek Non-MSBuild dengan Open Folder

Visual Studio 2017 memperkenalkan fitur Open Folder. Fitur ini memungkinkan Anda mengkode, membangun, dan men-debug dalam folder yang berisi kode sumber tanpa perlu membuat solusi atau proyek apa pun. Sekarang lebih mudah untuk mulai menggunakan Visual Studio, bahkan jika proyek Anda bukan proyek berbasis MSBuild. Open Folder memberi Anda akses ke kemampuan pemahaman, pengeditan, pembuatan, dan debugging kode yang canggih. Fitur ini sama dengan yang sudah disediakan Visual Studio untuk proyek MSBuild. Untuk informasi selengkapnya, lihat proyek Buka Folder untuk C++.

  • Peningkatan pengalaman Open Folder. Anda dapat menyesuaikan pengalaman melalui file .json ini:
    • CppProperties.json untuk menyesuaikan pengalaman IntelliSense dan penelusuran.
    • Tasks.json untuk menyesuaikan langkah-langkah pembuatan.
    • Launch.json untuk menyesuaikan pengalaman debugging.
Visual Studio 2017 versi 15.3
  • Peningkatan dukungan untuk pengompilasi alternatif dan membangun lingkungan seperti MinGW dan Cygwin. Untuk informasi selengkapnya, lihat Menggunakan MinGW dan Cygwin dengan Visual C++ dan Open Folder.
  • Menambahkan dukungan untuk menentukan variabel lingkungan global dan khusus konfigurasi di CppProperties.json dan CMakeSettings.json. Variabel lingkungan ini dapat digunakan oleh konfigurasi debug yang ditentukan dalam launch.vs.json dan tugas di tasks.vs.json. Untuk informasi selengkapnya, lihat Menyesuaikan Lingkungan Anda dengan Visual C++ dan Open Folder.
  • Peningkatan dukungan untuk generator Ninja CMake, termasuk kemampuan untuk menargetkan platform 64-bit dengan mudah.

Dukungan CMake melalui Open Folder

Visual Studio 2017 memperkenalkan dukungan untuk menggunakan proyek CMake tanpa mengonversi ke file proyek MSBuild (.vcxproj). Untuk informasi selengkapnya, lihat Proyek CMake di Visual Studio. Membuka proyek CMake dengan Open Folder otomatis mengonfigurasi lingkungan untuk pengeditan, pembuatan, dan debugging C++.

  • C++ IntelliSense berfungsi tanpa perlu membuat file CppProperties.json di folder root. Kami menambahkan dropdown baru untuk memungkinkan pengguna beralih dengan mudah antara konfigurasi yang disediakan oleh file CMake dan CppProperties.json.

  • Konfigurasi lebih lanjut didukung melalui file CMakeSettings.json yang berada di folder yang sama dengan file CMakeLists.txt.

    CMake Buka Folder.

Visual Studio 2017 versi 15.3
  • Dukungan ditambahkan untuk generator Ninja CMake.
Visual Studio 2017 versi 15.4
  • Dukungan ditambahkan untuk mengimpor cache CMake yang ada.
Visual Studio 2017 versi 15.5

Pengembangan Windows desktop

Kami sekarang memberikan pengalaman penginstalan yang lebih terperinci untuk menginstal beban kerja C++ asli. Kami menambahkan komponen yang dapat dipilih yang memungkinkan Anda menginstal hanya alat yang Anda butuhkan. Ukuran penginstalan yang ditunjukkan untuk komponen yang tercantum dalam UI penginstal salah, dan meremehkan ukuran total.

Agar berhasil membuat proyek Win32 di beban kerja desktop C++, Anda harus menginstal toolset dan Windows SDK. Instal komponen yang direkomendasikan (dipilih) toolset VC++ 2017 v141 (x86, x64) dan Windows 10 SDK (10.0.nnnnn) untuk memastikannya berfungsi. Jika alat yang diperlukan tidak diinstal, proyek tidak akan berhasil dibuat, dan wizard berhenti merespons.

Visual Studio 2017 versi 15.5

Alat Visual C++ Build (sebelumnya tersedia sebagai produk mandiri) sekarang disertakan sebagai beban kerja di alat penginstal Visual Studio. Beban kerja ini hanya menginstal alat yang diperlukan untuk membangun proyek C++ tanpa menginstal ide Visual Studio. Toolset v140 dan v141 disertakan. Toolset v141 berisi peningkatan terbaru di Visual Studio 2017 versi 15.5. Untuk informasi selengkapnya, lihat Visual Studio Build Tools sekarang menyertakan Toolset MSVC VS2017 dan VS2015.

Pengembangan Linux dengan C++

Ekstensi populer Visual C++ untuk Pengembangan Linux sekarang menjadi bagian dari Visual Studio. Penginstalan ini menyediakan semua yang Anda butuhkan untuk mengembangkan dan men-debug aplikasi C++ yang berjalan di lingkungan Linux.

Visual Studio 2017 versi 15.2

Penyempurnaan dilakukan dalam berbagi kode lintas platform dan visualisasi jenis. Untuk informasi selengkapnya, lihat Peningkatan C++ Linux untuk berbagi kode lintas platform dan visualisasi jenis.

Visual Studio 2017 versi 15.5
  • Beban kerja Linux menambahkan dukungan untuk rsync sebagai alternatif untuk sftp untuk menyinkronkan file ke komputer Linux jarak jauh.
  • Dukungan ditambahkan untuk kompilasi silang yang menargetkan mikrokontroler ARM. Untuk mengaktifkannya dalam penginstalan, pilih pengembangan Linux dengan beban kerja C++ dan pilih opsi untuk Pengembangan IoT dan Tersemat. Opsi ini menambahkan alat kompilasi silang ARM GCC dan Buat ke penginstalan Anda. Untuk informasi selengkapnya, lihat Kompilasi Silang GCC ARM di Visual Studio.
  • Dukungan ditambahkan untuk CMake. Anda dapat mengerjakan dasar kode yang ada, yang menggunakan CMake, tanpa harus mengonversinya menjadi proyek Visual Studio. Untuk informasi selengkapnya, lihat Mengonfigurasi Proyek CMake Linux.
  • Dukungan ditambahkan untuk menjalankan tugas jarak jauh. Kemampuan ini memungkinkan Anda menjalankan perintah apa pun pada sistem jarak jauh yang ditentukan dalam Connection Manager Visual Studio. Tugas jarak jauh juga menyediakan kemampuan untuk menyalin file ke sistem jarak jauh. Untuk informasi selengkapnya, lihat Mengonfigurasi Proyek CMake Linux.
Visual Studio 2017 versi 15.7

Pengembangan game dengan C++

Gunakan keandalan C++ untuk membangun game profesional yang didukung oleh DirectX atau Cocos2d.

Pengembangan seluler dengan C++ untuk Android dan iOS

Kini Anda dapat membuat dan men-debug aplikasi seluler menggunakan Visual Studio yang dapat menargetkan Android dan iOS.

Aplikasi Universal Windows

C++ hadir sebagai komponen opsional untuk beban kerja Universal Windows App. Saat ini, Anda harus meningkatkan proyek C++ secara manual. Anda dapat membuka proyek Universal Windows Platform yang ditargetkan v140 pada Visual Studio 2017. Namun, Anda perlu memilih toolset platform v141 di halaman properti proyek jika Anda tidak menginstal Visual Studio 2015.

Opsi baru untuk C++ di Universal Windows Platform (UWP)

Anda sekarang memiliki opsi baru untuk menulis dan mengemas aplikasi C++ untuk Universal Windows Platform dan Windows Store: Infrastruktur Desktop Bridge memungkinkan Anda mengemas aplikasi desktop atau objek COM yang ada untuk penyebaran melalui Windows Store. Atau, untuk penyebaran melalui saluran yang ada melalui pemuatan samping. Kemampuan baru dalam Windows 10 memungkinkan Anda menambahkan fungsionalitas UWP ke aplikasi desktop Anda dengan berbagai cara. Untuk mengetahui informasi selengkapnya, lihat Desktop Bridge.

Visual Studio 2017 versi 15.5

Templat proyek Windows Application Packaging Project ditambahkan, yang sangat menyederhanakan pengemasan aplikasi desktop dengan Desktop Bridge. Templat ini tersedia di bagian File | Baru| Proyek | Terinstal| Visual C++ | Universal Windows Platform. Untuk informasi selengkapnya, lihat Mengemas aplikasi menggunakan Visual Studio (Desktop Bridge).

Saat menulis kode baru, Anda sekarang dapat menggunakan C++/WinRT, proyeksi bahasa C++ standar untuk Windows Runtime yang diterapkan hanya dalam file header. Ini memungkinkan Anda untuk menggunakan dan menulis WINDOWS Runtime API menggunakan pengompilasi C++ yang sesuai standar. C++/WinRT dirancang untuk memberi akses kelas satu ke API Windows modern bagi pengembang C++. Untuk informasi selengkapnya, lihat C++/WinRT.

Mulai build 17025 dari Windows SDK Insider Preview, C++/WinRT disertakan dalam Windows SDK. Untuk informasi selengkapnya, lihat C++/WinRT sekarang menyertakan Windows SDK.

Toolset platform Clang/C2

Toolset Clang/C2 yang dikirim dengan Visual Studio 2017 sekarang mendukung switch /bigobj, yang sangat penting untuk membangun proyek besar. Toolset ini juga mencakup beberapa perbaikan bug penting, baik di front-end maupun back-end pengompilasi.

Analisis kode C++

Pemeriksa Inti C++ untuk memberlakukan Panduan Inti C++ sekarang didistribusikan dengan Visual Studio. Aktifkan pemeriksa di halaman Ekstensi Analisis Kode di halaman properti proyek. Ekstensi kemudian disertakan saat Anda menjalankan analisis kode. Untuk informasi selengkapnya, lihat Menggunakan pemeriksa Panduan Inti C++.

Cuplikan layar kotak dialog Halaman Properti memperlihatkan Analisis > Kode Properti > Konfigurasi Umum dipilih dan sejumlah Pemeriksaan Inti yang tercantum di bagian Jalankan seperangkat aturan ini.

Visual Studio 2017 versi 15.3
  • Dukungan ditambahkan untuk aturan yang terkait dengan manajemen sumber daya.
Visual Studio 2017 versi 15.5
  • Pemeriksaan Panduan Inti C++ baru mencakup kebenaran pointer cerdas, penggunaan penginisialisasi global yang benar, dan penggunaan penandaan konstruksi seperti goto dan cast yang buruk.

  • Beberapa nomor peringatan yang mungkin Anda temukan di 15.3 tidak lagi tersedia di 15.5. Peringatan ini diganti dengan pemeriksaan yang lebih spesifik.

Visual Studio 2017 versi 15.6
Visual Studio 2017 versi 15.7

Pengujian unit di Visual Studio 2017

Visual Studio 2017 versi 15.5

Google Test Adapter dan Boost.Test Adapter sekarang tersedia sebagai komponen Pengembangan Desktop dengan beban kerja C++. Keduanya terintegrasi dengan Test Explorer. Dukungan CTest ditambahkan untuk proyek CMake (menggunakan Open Folder), meskipun integrasi penuh dengan Test Explorer belum tersedia. Untuk informasi selengkapnya, lihat Menulis pengujian unit untuk C/C++.

Visual Studio 2017 versi 15.6
  • Dukungan ditambahkan untuk dukungan pustaka dinamis Boost.Test.
  • Templat item Boost.Test sekarang tersedia di IDE.

Untuk informasi selengkapnya, lihat Boost.Test Pengujian Unit: Dukungan Pustaka Dinamis dan Templat Item Baru.

Visual Studio 2017 versi 15.7

Dukungan CodeLens ditambahkan untuk proyek pengujian unit C++. Untuk informasi selengkapnya, lihat Mengumumkan CodeLens untuk Pengujian Unit C++.

Diagnostik grafis Visual Studio

Alat Diagnostik Grafis Visual Studio: Anda dapat menggunakannya untuk merekam dan menganalisis masalah rendering dan performa di aplikasi Direct3D. Gunakan di aplikasi yang berjalan secara lokal di PC Windows Anda, di emulator perangkat Windows, atau di PC atau perangkat jarak jauh.

  • Input & Output untuk shader Vertex dan Geometri: Kemampuan untuk melihat input dan output shader vertex dan shader geometri telah menjadi salah satu fitur yang paling diminta. Sekarang didukung di alat. Pilih tahap VS atau GS dalam tampilan Tahapan Alur untuk mulai memeriksa input dan outputnya dalam tabel di bawah ini.

    Input/Output untuk shader.

  • Cari dan filter dalam tabel objek: Menyediakan cara cepat dan mudah untuk menemukan sumber daya yang Anda cari.

    Cuplikan layar bagian Tabel Objek dengan drop-down Jenis dan kotak teks Pencarian dipanggil.

  • Riwayat Sumber Daya: Tampilan baru ini menyediakan cara yang efisien untuk melihat seluruh riwayat modifikasi sumber daya seperti yang digunakan selama penyajian bingkai yang diambil. Untuk memanggil riwayat sumber daya apa pun, klik ikon jam di samping hyperlink sumber daya apa pun.

    Riwayat sumber daya.

    Ini menampilkan jendela alat Riwayat Sumber Daya baru, diisi dengan riwayat perubahan sumber daya.

    Perubahan riwayat sumber daya.

    Anda dapat mengambil bingkai dengan penangkapan tumpukan panggilan penuh diaktifkan. Itu memungkinkan Anda dengan cepat menyimpulkan konteks setiap peristiwa perubahan, dan memeriksanya dalam proyek Visual Studio Anda. Atur opsi penangkapan tumpukan lengkap dalam dialog Opsi Alat > Visual Studio di bawah Diagnostik Grafis.

  • Statistik API: Lihat ringkasan penggunaan API tingkat tinggi dalam bingkai Anda. Ini berguna untuk menemukan panggilan yang mungkin tidak Anda sadari bahwa Anda membuat sama sekali, atau panggilan yang Anda buat terlalu sering. Jendela ini tersedia melalui Lihat > Statistik API di Visual Studio Graphics Analyzer.

    Statistik API.

  • Statistik Memori: Lihat berapa banyak memori yang dialokasikan driver untuk sumber daya yang Anda buat dalam bingkai. Jendela ini tersedia melalui Lihat > Statistik Memori di Visual Studio Graphics Analyzer. Untuk menyalin data ke file CSV untuk ditampilkan di spreadsheet, klik kanan dan pilih Salin Semua.

    Statistik memori.

  • Validasi Bingkai: Daftar kesalahan dan peringatan baru menyediakan cara mudah untuk menavigasi daftar peristiwa Anda berdasarkan potensi masalah yang terdeteksi oleh lapisan debug Direct3D. Klik Lihat > Validasi Bingkai di Visual Studio Graphics Analyzer untuk membuka jendela. Lalu klik Jalankan Validasi untuk memulai analisis. Diperlukan beberapa menit untuk menyelesaikannya, tergantung kompleksitas bingkai.

    Validasi bingkai.

  • Analisis Bingkai untuk D3D12: Gunakan Analisis Bingkai untuk menganalisis performa draw-call dengan eksperimen "what-if" yang diarahkan. Beralih ke tab Analisis Bingkai dan jalankan analisis untuk melihat laporan.

    Analisis bingkai.

  • Peningkatan Penggunaan GPU: Pelacakan terbuka dapat diambil melalui profiler Penggunaan GPU Visual Studio dengan GPUView atau alat Windows Penganalisis Kinerja (WPA) untuk analisis yang lebih rinci. Jika Anda memiliki Toolkit Performa Windows yang terinstal, ada dua hyperlink: satu untuk WPA dan satu lagi untuk GPUView, di kanan bawah gambaran umum sesi.

    Penggunaan GPU.

    Jejak yang Anda buka di GPUView melalui tautan ini mendukung pembesaran dan panning garis waktu VS dan GPUView yang disinkronkan. Kotak centang di VS mengontrol apakah sinkronisasi diaktifkan atau tidak.

    GPUView.