Новые возможности C++ в Visual Studio 2017
В Visual Studio 2017 реализовано множество изменений и исправлений для среды C++. Мы устранили более 250 ошибок и обнаруженных проблем в компиляторе и инструментах. О многих из них нам сообщили клиенты с помощью инструментов для отправки сообщения о проблеме и отправки предложения в разделе Отправить отзыв. Спасибо, что сообщаете нам об ошибках!
Дополнительные сведения о новых возможностях всех компонентов Visual Studio см. на странице Новые возможности Visual Studio 2017. Сведения о новых возможностях C++ в Visual Studio 2019 см. в статье Новые возможности C++ в Visual Studio 2019. Сведения о новых возможностях для C++ в Visual Studio 2015 и более ранних версиях см. в статье Visual C++ What's New 2003 through 2015 (Новые возможности Visual C++ в версиях с 2003 по 2015). Дополнительные сведения о новых возможностях документации по C++ см . в документации по Microsoft C++: новые возможности.
Компилятор C++ в Visual Studio 2017
Улучшение соответствия C++
Мы обновили компилятор C++ и стандартную библиотеку в этом выпуске с улучшенной поддержкой возможностей C++11 и C++14. Кроме того, в предварительном виде реализована поддержка определенных возможностей, которые, как предполагается, войдут в стандарт C++17. Подробные сведения см. в статье C++ conformance improvements in Visual Studio 2017 (Улучшения соответствия C++ в Visual Studio 2017).
Visual Studio 2017 версии 15.5
Компилятор поддерживает около 75 % новых возможностей C++17, включая структурированные привязки, лямбда-выражения constexpr
, if constexpr
, встроенные переменные, выражения свертывания и добавление noexcept
в систему типов. Эти возможности доступны с использованием параметра /std:c++17
. Дополнительные сведения см. в статье Улучшения соответствия C++ в Visual Studio 2017.
Visual Studio 2017 версии 15.7
Набор инструментов компилятора MSVC в Visual Studio версии 15.7 теперь соответствует стандарту C++. Дополнительные сведения см. в статьях Announcing: MSVC Conforms to the C++ Standard (Объявление: MSVC соответствует стандарту C++) и Соответствие стандартам языка Microsoft C/C++.
Visual Studio 2017 версии 15.8
Параметр компилятора /experimental:preprocessor
позволяет включить новый экспериментальный препроцессор MSVC, который в будущем будет соответствовать всем применимым стандартам C и C++. Дополнительные сведения см. в статье Обзор нового препроцессора MSVC.
Новые параметры компилятора
/permissive-
: включите все параметры компилятора соответствия строгим стандартам и отключите большинство расширений компилятора майкрософт (но не__declspec(dllimport)
например). В Visual Studio 2017 версии 15.5 этот параметр включен по умолчанию. Режим соответствия/permissive-
включает поддержку двухэтапного поиска имени. Дополнительные сведения см. в статье Улучшения соответствия C++ в Visual Studio./diagnostics
: включает отображение диагностической ошибки или расположения предупреждения тремя разными способами: только номер строки, номер строки и столбец, а также номер строки и столбец, с осторожностью в строке кода./debug:fastlink
: включите до 30 % быстрее добавочного канала (vs. Visual Studio 2015), не копируя все данные отладки в PDB-файл. PDB-файл указывает на отладочную информацию для файлов объекта и библиотеки, используемых для создания исполняемого файла. См. статьи Ускорение цикла сборки C++ в VS "15"с помощью/Debug:fastlink
и Рекомендации ускорению операций сборки C++ в Visual Studio.В Visual Studio 2017 можно использовать
/sdl
с/await
. Мы удалили ограничение/RTC
для сопрограмм.
Visual Studio 2017 версия 15.3
/std:c++14
и/std:c++latest
: эти параметры компилятора позволяют выбрать определенные версии языка программирования ISO C++ в проекте. Большинство новых стандартных функций защищены с помощью параметра/std:c++latest
./std:c++17
включает набор функций C++17, который реализован с помощью компилятора. Этот параметр отключает компилятор и поддержку стандартной библиотеки для функций после выхода C++17 — тех функций, что были изменены и добавлены в более поздних версиях рабочего проекта — и исключает обновления стандарта C++. Чтобы включить эти функции, используйте/std:c++latest
.
Создание кода, безопасность, диагностика и управления версиями
В этом выпуске представлено несколько улучшений в области оптимизации и создания кода, управления версиями набора инструментов и диагностики. К важным улучшениям можно отнести следующие:
- Улучшенное создание кода циклов: поддержка автоматической векторизации деления целочисленных констант, улучшенное распознавание последовательностей memset.
- Улучшена безопасность кода: улучшена выбросы диагностика компилятора переполнения буфера, а
/guard:cf
теперь защита инструкций коммутатора, создающих таблицы переходов. - Управление версиями. Значение встроенного макроса препроцессора _MSC_VER теперь монотонно обновляется при каждом обновлении набора инструментов Visual C++. Дополнительные сведения см. в статье Visual C++ Compiler Version (Версия компилятора Visual C++).
- Новый макет набора инструментов. Компилятор и связанные средства сборки имеют новую структуру расположения и каталогов на компьютере разработки. Новый макет позволяет параллельно устанавливать несколько версий компилятора. Дополнительные сведения см. в статье Compiler Tools Layout in Visual Studio 2017 (Макет инструментов компилятора в Visual Studio 2017).
- Улучшенная диагностика. В окне вывода теперь отображается столбец, в котором произошла ошибка. Дополнительные сведения см. в статье Усовершенствования функций диагностики компилятора C++ в VS "15" Preview 5.
- При использовании соутинов экспериментальное ключевое слово ( доступно в параметре
/await
) было удалено. Нужно обновить код для использованияco_yield
вместо него. Дополнительные сведения см. в статье о преобразовании ключевого словаyield
вco_yield
в Visual Studio 2017.
Visual Studio 2017 версия 15.3
Улучшения диагностика компилятора. Дополнительные сведения см. в статье Diagnostic Improvements in Visual Studio 2017 15.3.0 (Улучшения диагностики в Visual Studio 2017 версии 15.3.0).
Visual Studio 2017 версии 15.5
Улучшение производительности среды выполнения Visual C++ все так же реализуется за счет повышения качества генерируемого кода. Это означает, что можно просто перекомпилировать код, и приложение будет работать быстрее. Представлен ряд совершенно новых оптимизаций компилятора, например векторизация условных скалярных хранилищ, объединение вызовов функций sin(x)
и cos(x)
в новую функцию sincos(x)
,а также устранение избыточных инструкций из оптимизатора SSA. Другие виды оптимизации компилятора являются улучшениями существующих функций, например эвристика векторизатора для условных выражений, улучшенные оптимизации цикла и значения типа float для функций min и max генератора кода. Компоновщик имеет новую и более быструю реализацию /OPT:ICF
, что может привести к ускорению компоновки на 9 %. Также доступны другие улучшения производительности инкрементной компоновки. Дополнительные сведения см. в разделах Параметр /OPT (оптимизации) и Параметр /INCREMENTAL (инкрементная компоновка).
Компилятор Microsoft C++ поддерживает Intel AVX-512. Он содержит инструкции, касающиеся длины вектора, которые применяют новые функции AVX-512 к 128-разрядным и 256-разрядным регистрам.
Параметр /Zc:noexceptTypes-
можно использовать для возврата к noexcept
версии C++14 при использовании режима C++17 в целом. Этот параметр позволяет обновить исходный код для соответствия C++17, без необходимости переписывать весь код throw()
. Дополнительные сведения см. в разделе Удаление спецификации динамических исключений и noexcept.
Visual Studio 2017 версии 15.7
- Новый переключатель компилятора /Qspectre предназначен для противодействия спекулятивному выполнению атак по сторонним каналам. Дополнительные сведения см. в записи блога Spectre mitigations in MSVC (Устранение рисков с использованием Spectre в MSVC).
- Новое диагностическое предупреждение для устранения рисков Spectre. Подробнее см. в записи блога Spectre diagnostic in Visual Studio 2017 Version 15.7 Preview 4 (Диагностика с использованием Spectre в Visual Studio 2017 версии 15.4, предварительная версия 4).
- Новое значение для параметра /Zc
/Zc:__cplusplus
обеспечивает корректное информирование о поддержке стандарта C++. Например, если этот параметр установлен и компилятор находится в режиме/std:c++17
, значение будет расширено до201703L
. Дополнительные сведения см. в записи блога MSVC now correctly reports __cplusplus (MSVC теперь корректно сообщает значение __cplusplus).
Стандартная библиотека C++
Усовершенствования правильности
Visual Studio 2017 RTM (версия 15.0)
- Незначительные усовершенствования диагностики
basic_string
_ITERATOR_DEBUG_LEVEL != 0
. Когда проверка IDL споткивается в строковом механизме, он теперь сообщает о конкретном поведении, которое вызвало поездку. Например, вместо "строкового итератора не разыменовывается" вы получаете "не удается разыменить строковый итератор, так как он выходит из диапазона (например, конечный итератор)". - Исправлен оператор присваивания перемещением
std::promise
, из-за которого раньше в коде могла возникнуть вечная блокировка. - Устранены ошибки в компиляторе, связанные с неявным преобразованием
atomic<T*>
вT*
. pointer_traits<Ptr>
теперь корректно обнаруживаетPtr::rebind<U>
.- Исправлен отсутствующий квалификатор
const
в операторе вычитанияmove_iterator
. - Исправлено автоматическое неправильное создание кода для определяемых пользователем распределителей с отслеживанием состояния, запрашивающих
propagate_on_container_copy_assignment
иpropagate_on_container_move_assignment
. atomic<T>
теперь допускает перегруженныеoperator&()
.- Немного улучшилась диагностика компилятора для неверных вызовов
bind()
.
В Visual Studio 2017 RTM представлены и другие улучшения стандартной библиотеки. Полный список см. в записи блога команды разработчиков C++ об исправлениях стандартной библиотеки в Visual Studio 2017 RTM.
Visual Studio 2017 версия 15.3
- Теперь контейнеры стандартной библиотеки выполняют приведение
max_size()
вnumeric_limits<difference_type>::max()
, а неmax()
вsize_type
. Это гарантирует, что результатdistance()
с итераторами из этого контейнера можно представить в возвращаемом типеdistance()
. - Исправлена отсутствующая специализация
auto_ptr<void>
. - Алгоритмы
for_each_n()
,generate_n()
иsearch_n()
ранее не компилировались, если аргумент длины не был целочисленного типа. Теперь они пытаются преобразовать неинтегральные длины в итераторыdifference_type
. normal_distribution<float>
больше не выдает предупреждения в стандартной библиотеке о сужающем преобразовании из типа double во float.- Исправлены некоторые операции
basic_string
, которые использовалиnpos
вместоmax_size()
при проверке переполнения максимального размера. condition_variable::wait_for(lock, relative_time, predicate)
приходилось ожидать в течение всего относительного времени в случае ложного пробуждения. Теперь этот метод ожидает только в течение одного интервала относительного времени.future::get()
теперь не допускаетfuture
, как того требует стандарт.iterator_traits<void *>
являлся критической ошибкой, так как он пытался сформироватьvoid&
. Теперь он становится пустой структурой, позволяющей использоватьiterator_traits
в условиях SFINAE is iterator.- Некоторые предупреждения, поступавшие от Clang
-Wsystem-headers
, были исправлены. - Также исправлена ошибка «Спецификация исключения в объявлении не соответствует предыдущему объявлению», поступавшая от Clang
-Wmicrosoft-exception-spec
. - Кроме того, исправлены предупреждения упорядочивания mem-initializer-list, о которых сообщают Clang и C1XX.
- Неупорядоченные контейнеры не переключали хэширование и предикаты при переключении. Теперь они это делают.
- Многие операции переключения контейнеров теперь помечены как
noexcept
(так как наша стандартная библиотека никогда не будет выдавать исключение при обнаружении неопределенного условия поведения non-propagate_on_container_swap
non-equal-allocator). - Многие операции
vector<bool>
теперь помечены какnoexcept
. - Стандартная библиотека теперь применяет соответствующий распределитель
value_type
(в режиме C++17) с выходом на экранный люк. - Исправлены некоторые условия, при которых self-range-insert в
basic_string
будет шифровать содержимое строки. (Обратите внимание, что использование self-range-insert в векторах все еще запрещено стандартной библиотекой.) basic_string::shrink_to_fit()
больше не затрагиваетсяpropagate_on_container_swap
распределителя.std::decay
теперь обрабатывает недопустимые типы функций (например, типы функций с квалификацией типа cv, ref или обоих типов одновременно).- Изменены директивы включения для использования правильного учета регистра и косых черт, улучшая мобильность.
- Исправлено предупреждение C4061 "перечислитель" в переключателе перечисления "перечисление" не обрабатывается явным образом меткой регистра". Это предупреждение отключено по умолчанию и было исправлено в качестве исключения в общей политике стандартной библиотеки для предупреждений. (В стандартной библиотеке не используется
/W4
, но используется/Wall
. Множество отключенных по умолчанию предупреждений срабатывают слишком часто и не предназначены для постоянного использования.) - Улучшены проверки отладки
std::list
. Итераторы списка теперь проверяютoperator->()
, аlist::unique()
помечает итераторы как недействительные. - Исправлено метапрограммирование uses-allocator в
tuple
.
Visual Studio 2017 версии 15.5
std::partition
теперь вызывает предикатN
раз вместоN + 1
раз, в соответствии с требованиями стандарта.- Попытки избежать магической статики в версии 15.3 исправлены в версии 15.5.
std::atomic<T>
больше не требуетсяT
, чтобы быть конструируемым по умолчанию.- Алгоритмы кучи, которые принимают логарифмическое время, теперь работают иначе, если включена отладка итератора. Они больше не реализуют утверждение линейного времени о том, что входные данные на самом деле представляют собой кучу.
__declspec(allocator)
теперь защищается только для C1XX, чтобы предотвращать вывод предупреждений из Clang, который не понимает declspec.basic_string::npos
теперь доступен в качестве константы времени компиляции.std::allocator
теперь правильно обрабатывает выделение чрезмерно выровненных типов (типов, выравнивание которых большеmax_align_t
) в режиме C++17 (если не отключено с помощью/Zc:alignedNew-
). Например, векторы объектов с 16- или 32-байтовым выравниванием теперь правильно выравниваются для инструкций SSE и AVX.
Улучшение соответствия
- Добавлены <any>, <string_view>,
apply()
,make_from_tuple()
. - Добавлены <optional>, <variant>,
shared_ptr::weak_type
и <cstdalign>. - Включено C++14
constexpr
вmin(initializer_list)
,max(initializer_list)
,minmax(initializer_list)
,min_element()
,max_element()
иminmax_element()
.
Дополнительные сведения см. в статье Соответствие стандартам языка Microsoft C/C++.
Visual Studio 2017 версия 15.3
- Реализованы несколько других функций C++17. Дополнительные сведения см. в статье Таблица соответствия Microsoft Visual C++ стандартам языка.
- Реализовано исправление P0602R0: variant и optional должны распространять тривиальность копирования и перемещения.
- Стандартная библиотека теперь официально допускает отключение динамической RTTI с помощью параметра /GR-. Для
dynamic_pointer_cast()
иrethrow_if_nested()
изначально требуетсяdynamic_cast
, поэтому стандартная библиотека теперь помечает их как=delete
в параметре/GR-
. - Даже если динамический RTTI отключен через
/GR-
"статический RTTI" в видеtypeid(SomeType)
по-прежнему доступен, и выполняет несколько стандартных компонентов библиотеки. Стандартная библиотека теперь также поддерживает отключение этой возможности с использованием/D_HAS_STATIC_RTTI=0
. Этот флаг отключает также функции-членыstd::any
,target()
иtarget_type()
дляstd::function
и дружественную функцию-членget_deleter()
дляstd::shared_ptr
иstd::weak_ptr
. - Стандартная библиотека теперь использует C++14
constexpr
без дополнительный условий вместо макросов, определяемых условиями. - Стандартная библиотека теперь использует шаблоны псевдонимов внутренним образом.
- Стандартная библиотека теперь внутренне использует
nullptr
вместоnullptr_t{}
. (Внутреннее использование NULL устранено. Внутреннее использование 0-as-NULL постепенно очищается.) - Стандартная библиотека теперь внутренне использует
std::move()
вместо стилистически неправильного использованияstd::forward()
. - Изменено с
static_assert(false, "message")
на#error message
. Это изменение улучшает диагностику компилятора, так как#error
немедленно прекращает компиляцию. - Стандартная библиотека больше не помечает функции как
__declspec(dllimport)
. Для современных компоновщиков это больше не требуется. - Извлечены SFINAE для аргументов шаблона по умолчанию, что сокращает беспорядок по сравнению с типами возвращаемых данных и типами аргумента функции.
- При проверке отладки в режиме <random> теперь используются обычные механизмы стандартной библиотеки вместо внутренней функции
_Rng_abort()
, которая вызывалаfputs()
вstderr
. Реализация этой функции сохраняется для двоичной совместимости. Мы удалим ее в следующей версии стандартной библиотеки, несовместимой с двоичным кодом.
Visual Studio 2017 версии 15.5
- В соответствии со стандартом C++17 были добавлены, признаны нерекомендуемыми и удалены несколько функций стандартной библиотеки. Дополнительные сведения см. в статье Улучшения соответствия C++ в Visual Studio.
- Экспериментальная поддержка следующих параллельных алгоритмов:
all_of
any_of
for_each
for_each_n
none_of
reduce
replace
replace_if
sort
- В настоящее время подписи для следующих параллельных алгоритмов добавлены, но не параллелизированы. Профилирование не показало преимущества параллелизации алгоритмов, которые перемещают или перемыкают элементы:
copy
copy_n
fill
fill_n
move
reverse
reverse_copy
rotate
rotate_copy
swap_ranges
Visual Studio 2017 версии 15.6
<memory_resource>
- Основы работы с библиотеками V1
- Удаление присваивания
polymorphic_allocator
- Улучшение выведения аргументов шаблонов класса
Visual Studio 2017 версии 15.7
- Поддержка параллельных алгоритмов теперь не является экспериментальной
- Новая реализация
<filesystem>
- Простые преобразования строк (частично)
std::launder()
std::byte
hypot(x,y,z)
- Отказ от лишнего вырождения
- Специальные математические функции
constexpr char_traits
- Рекомендации по удержанию для стандартной библиотеки
Дополнительные сведения см. в статье Соответствие стандартам языка Microsoft C/C++.
Повышение производительности и пропускной способности
- Теперь перегрузки
basic_string::find(char)
вызываютtraits::find
только один раз. Ранее это было реализовано в качестве общего механизма поиска строки для строки длиной 1. - Теперь
basic_string::operator==
проверяет размер строки перед сравнением содержимого строк. - Удалена взаимозависимость элементов управления в
basic_string
, которая вызывала трудности при анализе оптимизатором компилятора. Для всех коротких строк вызовreserve
по-прежнему имеет ненулевое значение затрат при отсутствии выполняемых операций. std::vector
был исправлен для правильности и производительности: псевдоним во время операций вставки и внедрения теперь правильно обрабатывается в соответствии со стандартом, в настоящее время строгое исключение гарантируется, когда требуется стандартнаяmove_if_noexcept()
логика и другая логика, а также вставка и назначение меньше операций элементов.- Стандартная библиотека C++ теперь избегает разыменования пустых (NULL) указателей.
- Улучшена производительность
weak_ptr::lock()
. - Для повышения скорости работы компилятора заголовки стандартной библиотеки C++ теперь не включают объявления для ненужных встроенных функций компилятора.
- Производительность конструкторов перемещения
std::string
иstd::wstring
повышена более чем в 3 раза.
Visual Studio 2017 версия 15.3
- Устранена проблема взаимодействия с
noexcept
, которая не позволяла встраивать реализациюstd::atomic
в функции, которые используют структурированную обработку исключений (SEH). - Изменена внутренняя функция стандартной библиотеки
_Deallocate()
, чтобы оптимизировать ее в код меньшего размера, что позволяет встроить ее в большее количество мест. - Изменен
std::try_lock()
для использования расширения пакета вместо рекурсии. - Улучшен алгоритм предотвращения взаимоблокировки
std::lock()
при использовании операцийlock()
вместо обращения ко всем методамtry_lock()
блокировки. - Включена оптимизация именованных возвращаемых значений в
system_category::message()
. conjunction
иdisjunction
теперь создают экземпляры типовN + 1
, а не типов2N + 2
.std::function
больше не создает экземпляры механизмов поддержки распределителя для каждого вызываемого элемента с удалением типа, улучшая пропускную способность и уменьшая размер .obj в программах, которые передают много различных лямбда-выражений вstd::function
.allocator_traits<std::allocator>
содержит вручную встроенные операцииstd::allocator
, уменьшая объем кода в коде, который взаимодействует сstd::allocator
только черезallocator_traits
(то есть, в большей части кода).- Интерфейс минимального распределителя C++11 теперь обрабатывается таким образом: стандартная библиотека напрямую вызывает
allocator_traits
, а не помещает распределитель во внутренний класс_Wrap_alloc
. Это изменение уменьшает размер кода, создаваемого для поддержки распределителя, в некоторых случаях улучшается способность оптимизатора делать выводы о контейнерах стандартной библиотеки и оптимизируется отладка (так как теперь в отладчике отображается тип распределителя, а не_Wrap_alloc<your_allocator_type>
). - Удалено метапрограммирование для настроенного метода
allocator::reference
, распределители которого запрещено настраивать. (Распределители могут настроить в контейнерах использование специальных указателей, но не специальных ссылок.) - Интерфейс компилятора переделан для распаковывания итераторов отладки в цикле for на основе диапазона, улучшая производительность отладочных сборок.
- Путь внутреннего сжатия
basic_string
дляshrink_to_fit()
иreserve()
больше не перераспределяет операции, уменьшая объем кода для всех участников изменения. - Внутренний путь создания
basic_string
больше не находится в путиshrink_to_fit()
. - Операции изменения
basic_string
теперь факторизованы в быстром пути без распределения и в функциях медленного пути с распределением, повышая вероятность встраивания стандартного сценария без распределения в вызывающие объекты. - Операции изменения
basic_string
теперь создают перераспределенные буферы в предпочтительном состоянии, а не изменяют их размер на месте. Например, вставка в начале строки теперь перемещает содержимое после вставки только один раз. Оно перемещается либо вниз, либо в новый выделенный буфер. Оно больше не перемещается дважды в регистре перераспределения — сначала в новый выделенный буфер, а затем вниз. - Операции, вызывающие стандартную библиотеку C в <string> теперь кэшируют адрес
errno
для удаления повторяющегося взаимодействия с протоколом TLS. - Упрощена реализация
is_pointer
. - Завершено изменение основанного на функции выражения SFINAE на
struct
илиvoid_t
. - Алгоритмы стандартной библиотеки теперь не используют итераторы последующего увеличения.
- Устранены предупреждения об усечении при использовании 32-разрядных распределителей в 64-разрядных системах.
std::vector
перемещает назначение эффективнее в случае использования неравного распределителя без применения non-POCMA, повторно используя буфер по необходимости.
Visual Studio 2017 версии 15.5
basic_string<char16_t>
теперь использует те жеmemcmp
,memcpy
, а также аналогичные оптимизации, применяемыеbasic_string<wchar_t>
.- Ограничение оптимизатора, которое не позволяло указателям на функции быть представленными как встроенные в Visual Studio 2015 с обновлением 3, устранено, что способствует восстановлению производительности
lower_bound(iter, iter, function pointer)
. - Затраты на проверку порядка входных данных для включаемых файлов,
includes
,set_difference
,set_symmetric_difference
иset_union
, выполняемую при отладке итератора, были сокращены за счет распаковки итераторов перед проверкой. std::inplace_merge
теперь пропускает элементы, которые уже находятся в нужной позиции.- При создании
std::random_device
больше не создается и затем удаляетсяstd::string
. std::equal
иstd::partition
использовали проход оптимизации потоков перехода, который избавлял от сравнения итераторов.- При
std::reverse
передаче указателей на тривиально копируемыеT
элементы теперь отправляются в рукописную векторную реализацию. std::fill
,std::equal
иstd::lexicographical_compare
могут выполнять передачу вmemset
иmemcmp
дляstd::byte
иgsl::byte
(и другие аналогичные символьным перечисления и классы перечислений).std::copy
выполняет диспетчеризацию с помощьюis_trivially_copyable
, поэтому вносить изменения не требуется.- Стандартная библиотека больше не содержит деструкторы с пустыми скобками, единственное действие которых заключалось в том, чтобы сделать типы нетривиально уничтожаемыми.
Прочие библиотеки
Поддержка библиотеки с открытым исходным кодом
Vcpkg является средством командной строки с открытым исходным кодом, которое значительно упрощает процесс получения и создания статических библиотек открытым исходным кодом C++ и библиотек DLL в Visual Studio. Дополнительные сведения см. на странице о vcpkg.
Пакет SDK для CPPRest 2.9.0
Visual Studio 2017 версии 15.5
CPPRestSDK, кроссплатформенный веб-API для C++, обновляется до версии 2.9.0. Дополнительные сведения см. в статье Доступность CppRestSDK 2.9.0 в GitHub.
ATL
Visual Studio 2017 версии 15.5
- Еще один набор исправлений соответствия поиска по имени.
- Существующие конструкторы перемещения и операторы назначения перемещения теперь правильно помечены как неразроумные
- Отменено отключение допустимого предупреждения C4640 о потокобезопасной инициализации локальных статических элементов в atlstr.h.
- Потокобезопасная инициализация локальных статических элементов автоматически отключалась в наборе инструментов XP при использовании ATL и сборке библиотеки DLL. Теперь этого не происходит. Если вы не хотите использовать потокобезопасную инициализацию, добавьте
/Zc:threadSafeInit-
в параметры проекта.
Среда выполнения Visual C++
- Новый заголовок "cfguard.h" для символов защиты потока управления.
Интегрированная среда разработки для языка C++ Visual Studio 2017
- Повышена производительность изменения конфигурации для проектов в машинном коде на C++ и проектов C++/CLI. Когда конфигурация решения активируется в первый раз, она выполняется быстрее и все последующие активации этой конфигурации решения практически мгновенно.
Visual Studio 2017 версия 15.3
- Некоторые мастера проекта и кода были переписаны в стиле диалоговых окон с подписями.
- При выборе пункта меню Добавить класс теперь запускается мастер добавления классов. Все остальные элементы, ранее находившиеся здесь, теперь доступны в разделе Добавить > Новый элемент.
- Проекты Win32 теперь находятся в каталоге Классические приложения Windows в диалоговом окне Создание проекта.
- При выборе шаблонов Консольное приложение Windows и Классическое приложение Windows теперь создаются проекты без вызова мастера. Теперь доступен новый мастер создания классических приложений Windows. Он отображается в той же категории, что и прежний мастер создания консольных приложение Win32, и с теми же параметрами.
Visual Studio 2017 версии 15.5
несколько операций C++, которые используют модуль IntelliSense для навигации по коду и рефакторинга кода, работают гораздо быстрее. Следующие данные основаны на решении Visual Studio Chromium решения с 3500 проектами.
Функция | Повышение производительности |
---|---|
Переименовать | в 5,3 раза |
Изменение сигнатуры | в 4,5 раза |
Найти все ссылки | в 4,7 раза |
C++ теперь поддерживает комбинацию клавиши CTRL+щелчок мыши, что упрощает переход к определениям с помощью мыши. Визуализатор структуры из пакета инструментов повышения производительности теперь также включен в продукт по умолчанию.
IntelliSense
По умолчанию теперь используется новое ядро СУБД на основе SQLite. Новый модуль ускоряет операции базы данных, такие как переход к определению и поиск всех ссылок. Он значительно сокращает начальное время анализа решения. Параметр перемещен в текстовый редактор > параметров > инструментов > C/C++ > Advanced. (Раньше он находился в разделе …C/C++ > Экспериментальные.)
Мы улучшили производительность IntelliSense в проектах и файлах, не использующих предварительно скомпилированные заголовки. Автоматический предварительно компилированный заголовок создается для заголовков в текущем файле.
Добавлена фильтрация ошибок и справка по ошибкам IntelliSense для списка ошибок. Теперь выполнить фильтрацию можно, просто щелкнув столбец ошибок. Кроме того, щелкнув определенные ошибки или нажав клавишу F1, запускается онлайн-поиск сообщения об ошибке.
Добавлена фильтрация пунктов списка элементов по виду.
Добавлена новая экспериментальная возможность — прогнозная технология IntelliSense, — которая фильтрует содержимое списка элементов с учетом контекста. Подробнее см. статью Усовершенствования C++ IntelliSense — прогнозная технология IntelliSense и фильтрация.
Команда Найти все ссылки (SHIFT+F12) теперь позволяет легко перемещаться даже по сложным базам кода. Она предоставляет расширенные возможности группирования, фильтрации, сортировки, поиска в найденном и цветового выделения результатов. Это дает вам четкое понимание ссылок. Для C++ предоставлен новый компонент пользовательского интерфейса, который содержит информацию о том, выполняется ли чтение из переменной или запись в переменную.
Функция IntelliSense dot-to-Arrow перемещена из экспериментального в расширенный и теперь включена по умолчанию. Функции редактора расширяют области и расширяют приоритет , перемещаются из экспериментального в расширенный.
Экспериментальные функции рефакторинга Изменить сигнатуру и Извлечь функцию теперь доступны по умолчанию.
Добавлена экспериментальная функция для проектов C++ "Меньшее время загрузки проекта". Когда вы в следующий раз откроете проект C++, он загрузится быстрее, а в следующий раз — очень быстро.
Некоторые из этих функций являются общими для других языков, а некоторые специфичны для C++. Дополнительные сведения об этих новых возможностях см. в объявлении о выпуске Visual Studio 15, предварительная версия 5.
Visual Studio 2017 версии 15.7
- добавлена поддержка ClangFormat. Дополнительные сведения см. в записи блога ClangFormat Support in Visual Studio 2017 (Поддержка ClangFormat в Visual Studio).
Поддержка проектов, отличных от MSBuild, с помощью функции "Открыть папку"
В Visual Studio 2017 появилась функция Открыть папку. Она позволяет писать код, выполнять сборку и отладку в папке, содержащей исходный код, не создавая каких-либо решений и проектов. Теперь проще приступить к работе с Visual Studio, даже если проект не является проектом на основе MSBuild. Функция Открыть папку предоставляет доступ к мощным средствам для анализа, редактирования, сборки и отладки кода. Это та же функция, которую Visual Studio уже предоставляет для проектов MSBuild. Дополнительные сведения см. в статье Проекты "Открыть папку" для C++.
- Улучшения в процедуре открытия папки. Вы можете настроить интерфейс с помощью этих .json файлов:
- CppProperties.json используется для настройки работы с IntelliSense и браузером.
- Tasks.json используется для настройки этапов сборки.
- Launch.json используется для настройки процедуры отладки.
Visual Studio 2017 версия 15.3
- Улучшенная поддержка альтернативных компиляторов и сред сборки, таких как MinGW и Cygwin. Дополнительные сведения см. в статье Using MinGW and Cygwin with Visual C++ and Open Folder (Использование MinGW и Cygwin с Visual C++ и функцией "Открыть папку").
- Добавлена поддержка определения глобальных и зависящих от конфигурации переменных среды в файлах CppProperties.json и CMakeSettings.json. Эти переменные среды могут использоваться в конфигурациях отладки, определенных в файле launch.vs.json, и в задачах, определенных в файле tasks.vs.json. Дополнительные сведения см. в статье Использование MinGW и Cygwin с Visual C++ и функцией "Открыть папку".
- Улучшена поддержка генератора CMake Ninja, включая упрощение выбора 64-разрядной платформы в качестве целевой.
Поддержка CMake с помощью функции "Открыть папку"
В Visual Studio 2017 добавлена поддержка использования проектов CMake без преобразования в файлы проекта MSBuild (с расширением VCXPROJ). Дополнительные сведения см. в статье Проекты CMake в Visual C++. При открытии проектов CMake с помощью функции Открыть папку автоматически настраивается среда для редактирования, сборки и отладки кода C++.
Для работы C++ IntelliSense не требуется создавать файл CppProperties.json в корневой папке. Мы добавили новый раскрывающийся список, чтобы пользователи могли легко переключаться между конфигурациями, предоставляемыми CMake и CppProperties.json файлами.
Дальнейшая настройка поддерживается посредством файла CMakeSettings.json, который находится в одной папке с файлом CMakeLists.txt.
Visual Studio 2017 версия 15.3
- добавлена поддержка генератора CMake Ninja.
Visual Studio 2017 версии 15.4
- добавлена поддержка импорта существующих кэшей CMake.
Visual Studio 2017 версии 15.5
- добавлена поддержка CMake 3.11, анализ кода в проектах CMake, представление целевых объектов в обозревателе решений, параметры формирования кэша и компиляция на базе одного файла. Дополнительные сведения см. в статьях CMake support in Visual Studio (Поддержка CMake в Visual Studio) CMake projects in Visual C++ (Проекты CMake в Visual C++).
Разработка классических приложений для Windows
Теперь предоставляется более точный контроль над процедурой установки исходной рабочей нагрузки C++. Мы добавили доступные для выбора компоненты, которые позволяют устанавливать только необходимые инструменты. В пользовательском интерфейсе установщика указаны неточные размеры установки для компонентов. Таким образом, общий размер занижен.
Чтобы успешно создавать проекты Win32 в рабочей нагрузке для разработки приложений на C++, необходимо установить набор средств и пакет SDK для Windows. Для гарантии работы следует установить рекомендуемые (выбранные) компоненты Набор средств VC++ 2017 v141 (x86, x64) и Пакет SDK Windows 10 (10.0.nnnnn). Если необходимые средства не установлены, проекты не будут созданы успешно, а мастер перестает отвечать.
Visual Studio 2017 версии 15.5
Visual C++ Build Tools (ранее доступный как отдельный продукт), теперь включен в Visual Studio Installer в качестве рабочей нагрузки. Эта рабочая нагрузка устанавливает только инструменты, необходимые для сборки проектов C++ без установки среды Visual Studio. Включены наборы инструментов v141 и v140. Набор инструментов v141 содержит последние улучшения в Visual Studio 2017 версии 15.5. Дополнительные сведения см. в статье В состав Visual Studio Build Tools теперь входят наборы инструментов MSVC VS2017 и VS2015.
Разработка для Linux на C++
Популярное расширение, Visual C++ для разработки приложений Linux, теперь стало частью Visual Studio. В этой установке представлено все необходимое для разработки и отладки приложений C++, работающих в среде Linux.
Visual Studio 2017 версии 15.2
Усовершенствования были сделаны в межплатформенной визуализации совместного использования кода и визуализации типов. Дополнительные сведения см. в статье Linux C++ improvements for cross-platform code sharing and type visualization (Улучшения Linux C++ при использовании кроссплатформенного кода и визуализации типов).
Visual Studio 2017 версии 15.5
- Рабочая нагрузка Linux добавила поддержку rsync в качестве альтернативы sftp для синхронизации файлов с удаленными компьютерами Linux.
- Добавлена поддержка для перекрестной компиляции, предназначенной для микроконтроллеров ARM. Чтобы включить ее в установку, выберите рабочую нагрузку Разработка приложений Linux на C++ и установите флажок Разработка для встроенных платформ и Интернета вещей. В вашу установку будут добавлены инструменты перекрестной компиляции ARM GCC и Make. Дополнительные сведения см. в статье Перекрестная компиляция ARM GCC в Visual Studio.
- Добавлена поддержка для CMake. Теперь вы можете работать с существующей базой кода, не преобразовывая ее в проект Visual Studio. Дополнительные сведения см. в разделе Настройка проекта Linux CMake.
- Добавлена поддержка для выполнения удаленных задач. Эта возможность позволяет запускать любую команду в удаленной системе, которая определена в диспетчере подключений Visual Studio. Удаленные задачи также позволяют копировать файлы в удаленную систему. Дополнительные сведения см. в разделе Настройка проекта Linux CMake.
Visual Studio 2017 версии 15.7
- Различные улучшения сценариев рабочих нагрузок в Linux. Дополнительные сведения см. в записи блога Изменения в рабочих нагрузках C++ в Linux для системы проектов, консольного окна Linux, rsync and команды "Присоединение к процессу".
- IntelliSense для заголовков удаленных подключений Linux. Дополнительные сведения см. в статьях IntelliSense for Remote Linux Headers (IntelliSense для удаленных заголовков Linux) и Настройка проекта Linux CMake.
Разработка игр на языке C++
Доступны все возможности C++ для создания профессиональных игр на базе DirectX или Cocos2d.
Разработка мобильных приложений на C++ для iOS и Android
Теперь в Visual Studio можно создавать мобильные приложения для Android и iOS и отлаживать их.
Универсальные приложения Windows
C++ поставляется как дополнительный компонент для рабочей нагрузки универсального приложения для Windows. В настоящее время проекты C++ необходимо обновлять вручную. В Visual Studio 2017 можно открыть проект универсальной платформы Windows, предназначенный для версии 140. Тем не менее, если у вас не установлена среда Visual Studio 2015, вам нужно выбрать набор инструментов платформы версии 141 на страницах свойств проекта.
Новые возможности C++ на универсальной платформе Windows (UWP)
Теперь у вас есть новые возможности для написания и упаковки приложений C++ для универсальная платформа Windows и Магазина Windows: инфраструктура мост для классических приложений позволяет упаковывать существующее классическое приложение или COM-объект для развертывания через Магазин Windows. Также его можно подготовить для развертывания через существующие каналы с помощью загрузки неопубликованных компонентов. Благодаря новым возможностям в Windows 10 можно добавлять функции UWP в классическое приложение различными способами. Дополнительные сведения см. в статье Мост для классических приложений.
Visual Studio 2017 версии 15.5
Добавлен шаблон Проект упаковки приложений Windows, который значительно упрощает упаковку классических приложений благодаря мосту для классических приложений. Он находится в разделе Файл | Создать | Проект | Установленные | Visual C++ | Универсальная платформа Windows. Дополнительные сведения см. в статье Упаковка приложения с помощью Visual Studio (мост для классических приложений).
При написании кода теперь можно использовать C++/WinRT — это проекция стандартного C++ для среды выполнения Windows, реализованная исключительно за счет файлов заголовков. Она позволяет как использовать, так и создавать API среды выполнения Windows с помощью любого соответствующего стандартам компилятора C++. C++/WinRT предоставляет разработчикам на C++ первоклассный доступ к современным API Windows. Дополнительные сведения см. в статье C++/WinRT.
Начиная со сборки 17025 Insider Preview пакета SDK Windows, C++/WinRT входит в пакет Windows SDK. Дополнительные сведения см. в статье C++/WinRT включен в состав пакета Windows SDK.
Набор инструментов платформы Clang/C2
Набор инструментов Clang/C2, который поставляется с Visual Studio 2017, теперь поддерживает параметр /bigobj
, который крайне важен для сборки больших проектов. Он также включает несколько важных исправлений как во внешнем интерфейсе, так и в серверной части компилятора.
Анализ кода C++
Средства проверки на соответствие кода C++ проверенным рекомендациям (C++ Core Checker) теперь распространяются вместе с Visual Studio. Включите средства проверки на странице Code Analysis Extensions (Расширения анализа кода) на страницах свойств проекта. После этого расширения будут использоваться при анализе кода. Дополнительные сведения см. в статье Using the C++ Core Guidelines checkers (Использование средств проверки на соответствие рекомендациям C++ Core).
Visual Studio 2017 версия 15.3
- поддержка правил, связанных с управлением ресурсов.
Visual Studio 2017 версии 15.5
Новые проверки C++ Core Guidelines проверяют корректность интеллектуальных указателей, правильность использования глобальных инициализаторов и применение флагов конструкций, таких как
goto
и неправильные приведения.Некоторые номера предупреждений, которые можно найти в версии 15.3, больше не доступны в версии 15.5. Эти предупреждения были заменены более конкретными проверками.
Visual Studio 2017 версии 15.6
- Добавлена поддержка анализа одиночного файла, а также улучшения в анализе производительности времени выполнения. Дополнительные сведения см. в статье C++ Static Analysis Improvements for Visual Studio 2017 15.6 Preview 2 (Усовершенствования статического анализа C++ в Visual Studio 2017 15.6 Preview 2)
Visual Studio 2017 версии 15.7
- Добавлена поддержка параметра
/analyze:ruleset
, чтобы вы могли указать, какие нужно применять правила анализа кода. - Добавлена поддержка дополнительных правил основных рекомендаций C++ . Дополнительные сведения см. в статье Using the C++ Core Guidelines checkers (Использование средств проверки на соответствие рекомендациям C++ Core).
Модульное тестирование в Visual Studio 2017
Visual Studio 2017 версии 15.5
Адаптеры для Google Test и Boost.Test теперь доступны как компоненты рабочей нагрузки Разработка классических приложений на C++. Они интегрированы с обозревателем тестов. Добавлена поддержка CTest для проектов CMake (с использованием функции "Открыть папку"), хотя полная интеграция с обозревателем тестов еще не доступна. Дополнительные сведения см. в разделе Создание модульных тестов для C/C++.
Visual Studio 2017 версии 15.6
- Добавлена поддержка динамической библиотеки
Boost.Test
. - В интегрированной среде разработки теперь доступен шаблон элемента
Boost.Test
.
Дополнительные сведения см. в разделе Boost.Test
Модульное тестирование: поддержка динамической библиотеки и шаблон нового элемента.
Visual Studio 2017 версии 15.7
Добавлена поддержка CodeLens для проектов модульного тестирования C++. Дополнительные сведения см. в записи блога Announcing CodeLens for C++ Unit Testing (Объявлена поддержка CodeLens для модульного тестирования C++).
Диагностика графики в Visual Studio
Средства диагностики графики Visual Studio: их можно использовать для записи и анализа проблем с отрисовкой и производительностью в приложениях Direct3D. Используйте их для приложений, которые выполняются локально на компьютере под управлением Windows, в эмуляторе устройства Windows или на удаленном ПК или устройстве.
Входные и выходные данные для шейдеров вершин и геометрии: возможность просмотра входных и выходных данных шейдеров вершин и геометрических шейдеров была одной из самых запрошенных функций. Теперь она поддерживается в инструментах. Выберите этап вершинных или геометрических шейдеров в представлении "Этапы конвейера", чтобы запустить проверку входных и выходных данных, перечисленных в таблице ниже.
Поиск и фильтрация в таблице объектов: предоставляет быстрый и простой способ поиска нужных ресурсов.
Журнал ресурсов: новое представление упрощает просмотр всего журнала изменений ресурса, который использовался во время отрисовки захваченного кадра. Чтобы открыть журнал для любого ресурса, щелкните значок часов рядом с гиперссылкой на ресурс.
Откроется новое окно инструментов Журнал ресурсов, в котором заполнены данные об изменении ресурса.
Вы можете записать кадры при включенной записи полного стека вызовов. Это позволяет быстро определить контекст каждого события изменения и проверить его в проекте Visual Studio. Установите параметр записи полного стека в разделе Диагностика графики диалогового окна Сервис > Параметры Visual Studio.
Статистика использования API: просмотр общей сводки по использованию API в кадре. Это удобно для обнаружения вызовов вы можете не понимать, что вы делаете вообще, или вызовы, которые вы делаете слишком часто. Это окно можно открыть в анализаторе графики Visual Studio, выбрав Вид > Статистика API.
Статистика памяти. Просмотр объема памяти, выделяемой драйвером для ресурсов, создаваемых в кадре. Это окно можно открыть в анализаторе графики Visual Studio, выбрав Вид > Статистика памяти. Чтобы скопировать данные в CSV-файл для просмотра в электронной таблице, щелкните правой кнопкой мыши и выберите Копировать все.
Проверка кадра: с помощью нового списка ошибок и предупреждений можно легко перемещаться по списку событий на основе потенциальных проблем, обнаруженных уровнем отладки Direct3D. Чтобы открыть окно, в анализаторе графики Visual Studio выберите Вид > Проверка кадров. Затем щелкните Выполнить проверку, чтобы начать анализ. В зависимости от сложности кадра процесс может занять несколько минут.
Анализ кадров для D3D12: используйте анализ кадров для анализа производительности вызова рисования с помощью направленных экспериментов "what-if". Перейдите на вкладку "Анализ кадров", чтобы просмотреть отчет.
Улучшения использования GPU. Открыть трассировку можно использовать с помощью профилировщика использования GPU Visual Studio с ПОМОЩЬЮ GPUView или средства Windows Анализатор производительности (WPA) для более подробного анализа. Если у вас установлен набор средств производительности Windows, есть две гиперссылки: одна для WPA и другая для GPUView, в правом нижнем углу обзора сеанса.
Трассировки, открытые в GPUView с помощью этой ссылки, поддерживают синхронизацию масштабирования и масштабирования временной шкалы VS и GPUView. С помощью флажка в VS можно включать и отключать синхронизацию.