Novedades de C++ en Visual Studio 2017
Visual Studio 2017 incluye muchas actualizaciones y revisiones del entorno de C++. Hemos corregido más de 250 errores y se han comunicado problemas en el compilador y las herramientas. Muchos de estos problemas fueron enviados por los clientes mediante las opciones Notificar un problema y Aportar una sugerencia en Enviar comentarios. ¡Muchas gracias por notificárnoslos!
Para más información sobre todas las novedades de Visual Studio, visite Novedades de Visual Studio 2017. Para información sobre las novedades de C++ en Visual Studio 2019, consulte Novedades de C++ en Visual Studio 2019. Para información sobre las novedades de C++ en Visual Studio 2015 y versiones anteriores, consulte Novedades de Visual C++ de 2003 a 2015. Para obtener información sobre las novedades en la documentación de C++, consulte Documentación de Microsoft C++: novedades.
Compilador de C++ de Visual Studio 2017
Mejoras de conformidad de C++
En esta versión hemos actualizado el compilador de C++ y la biblioteca estándar mejorando la compatibilidad con las características de C++11 y C++14. También incluyen compatibilidad preliminar con ciertas características que se esperaba que estuvieran contenidas en el estándar C++17. Para obtener información detallada, vea Mejoras de conformidad de C++ en Visual Studio 2017.
Versión 15.5 de Visual Studio 2017
El compilador admite aproximadamente un 75 % de las características nuevas de C++17, incluidos los enlaces estructurados, las expresiones lambda constexpr
, if constexpr
, las variables alineadas, las expresiones fold y la adición de noexcept
al sistema de tipos. Estas características están disponibles en la opción /std:c++17
. Para obtener más información, consulte Mejoras de conformidad de C++ en Visual Studio 2017.
Visual Studio 2017 versión 15.7
El conjunto de herramientas del compilador MSVC en Visual Studio versión 15.7 ahora cumple con el estándar de C++. Para más información, vea Anuncio: MSVC cumple con el estándar de C++ y Conformidad del lenguaje Microsoft C/C++.
Visual Studio 2017, versión 15.8
El modificador del compilador /experimental:preprocessor
habilita el nuevo preprocesador MSVC experimental que finalmente será compatible con todos los estándares de C y C+ aplicables. Para más información, consulte el artículo de información general sobre el preprocesador nuevo de MSVC.
Nuevas opciones del compilador
/permissive-
: habilita todas las opciones del compilador de cumplimiento de estándares estrictos y deshabilita la mayoría de las extensiones del compilador específicas de Microsoft, pero no__declspec(dllimport)
, por ejemplo. Esta opción está activada de forma predeterminada en Visual Studio 2017 versión 15.5. El modo de cumplimiento/permissive-
incluye compatibilidad para la búsqueda de nombres en dos fases. Para obtener más información, vea C++ Conformance Improvements in Visual Studio (Mejoras de conformidad de C++ en Visual Studio)./diagnostics
: Permite mostrar la ubicación de la advertencia o del error de diagnóstico de tres maneras diferentes: solo el número de línea, el número de línea y columna, o el número de línea y columna con un símbolo de intercalación bajo la línea de código incorrecta./debug:fastlink
: permite tiempos de vínculo incremental hasta un 30 % más rápidos (frente a Visual Studio 2015), ya que no copia toda la información de depuración en el archivo PDB. En su lugar, el archivo PDB apunta a la información de depuración de los archivos de biblioteca y del objeto usados para crear el ejecutable. Consulte las páginas sobre el ciclo de compilación en C++ más rápido en Visual Studio "15" con/Debug:fastlink
y sobre las recomendaciones para acelerar las compilaciones en C++ en Visual Studio.Visual Studio 2017 permite usar
/sdl
con/await
. Se ha eliminado la limitación/RTC
con corrutinas.
Visual Studio 2017 versión 15.3
/std:c++14
y/std:c++latest
: estas opciones del compilador permiten participar en versiones específicas del lenguaje de programación ISO C++ en un proyecto. La mayoría de las nuevas características del borrador estándar están protegidas con la opción/std:c++latest
./std:c++17
habilita el conjunto de características de C++17 implementadas por el compilador. Esta opción deshabilita la compatibilidad del compilador y la biblioteca estándar con las características posteriores a C++17 o que se han modificado en las versiones del borrador de trabajo y las actualizaciones de defectos de C++ Standard. Para habilitar esas características, utilice/std:c++latest
.
Codegen, seguridad, diagnóstico y control de versiones
Esta versión ofrece varias mejoras en la optimización, la generación de código, el control de versiones del conjunto de herramientas y el diagnóstico. Estas son algunas de las mejoras destacables incluidas:
- Generación de código de bucles mejorada: compatibilidad con vectorización automática de división de enteros constantes, mejor identificación de patrones de memset.
- Seguridad de código mejorada: emisión mejorada de diagnósticos de compilador de saturación del búfer;
/guard:cf
ahora protege instrucciones switch que generan tablas de saltos. - Control de versiones: el valor de la macro de preprocesador integrada _MSC_VER ahora se actualiza de forma continua en cada actualización del conjunto de herramientas de Visual C++. Para obtener más información, vea Visual C++ Compiler Version (Versión del compilador de Visual C++).
- Nuevo diseño del conjunto de herramientas: el compilador y las herramientas de compilación relacionadas tienen una nueva ubicación y estructura de directorios en la máquina de desarrollo. El nuevo diseño permite instalaciones en paralelo de varias versiones del compilador. Para más información, consulte Compiler Tools Layout in Visual Studio 2017 (Diseño de las herramientas del compilador en Visual Studio 2017).
- Diagnóstico mejorado: en la ventana de salida ahora se muestra la columna en la que se produce un error. Para más información, vea C++ improvisamente diagnostics improvements in VS "15" Preview 5 (Mejoras del diagnóstico del compilador C++ en VS "15" Preview 5).
- Se ha eliminado la palabra clave experimental yield, disponible en la opción
/await
, al usar las corrutinas. En su lugar, se debe actualizar el código para que useco_yield
. Para más información, consulte el artículo sobre cómo la palabra claveyield
se convierte enco_yield
en VS 2017.
Visual Studio 2017 versión 15.3
Mejoras en los diagnósticos del compilador. Para más información, consulte el artículo sobre las mejoras de diagnósticos en Visual Studio 2017 15.3.0.
Versión 15.5 de Visual Studio 2017
El rendimiento del entorno de ejecución Visual C++ sigue mejorando debido a que la calidad del código generado es mayor. Ahora puede volver a compilar simplemente el código, y la aplicación se ejecutará más rápido. Algunas de las optimizaciones del compilador son totalmente nuevas, como la vectorización de almacenes escalares condicionales, la combinación de llamadas sin(x)
y cos(x)
en una nueva llamada sincos(x)
, y la eliminación de instrucciones redundantes del optimizador SSA. Otras optimizaciones del compilador son mejoras de funcionalidades existentes, como las heurísticas del vectorizador para expresiones condicionales, las optimizaciones de bucle mejoradas y la generación de código mín./máx. flotante. Ahora, el enlazador tiene una nueva implementación /OPT:ICF
más rápida, con la que podrá agilizar el tiempo de vínculo hasta un 9 %. Asimismo, los vínculos incrementales también presentan otras mejoras de rendimiento. Para obtener más información, vea /OPT (Optimizations) (/OPT (optimizaciones)) e /INCREMENTAL (Link Incrementally) (/INCREMENTAL (vincular de forma incremental)).
El compilador de Microsoft C++ es compatible con las instrucciones AVX-512 de Intel, así como con las instrucciones de longitud del vector que incorporan nuevas funciones de AVX-512 en registros con una amplitud de 128 y 256 bits.
La opción /Zc:noexceptTypes-
puede usarse para volver a la versión C++14 de noexcept
, pero se seguirá usando el modo C++17 a nivel general. Esta opción le permite actualizar el código fuente para que guarde conformidad con C++17 sin tener que reescribir todo el código de throw()
a la vez. Para obtener más información, vea Eliminación de las especificaciones de excepción dinámica y noexcept.
Visual Studio 2017 versión 15.7
- Nuevo modificador de compilador /Qspectre para ayudar a mitigar el riesgo de ataques de canal lateral de ejecución especulativa. Para más información, consulte Spectre Mitigations in MSVC (Mitigaciones de Spectre en MSVC).
- Nueva advertencia de diagnóstico para la mitigación de Spectre. Para más información, consulte Spectre diagnostic in Visual Studio 2017 Version 15.7 Preview 4 (Diagnóstico de Spectre en Visual Studio 2017 versión 15.7 [versión preliminar 4]).
- Un nuevo valor para /Zc,
/Zc:__cplusplus
, permite la generación de informes correctos de la compatibilidad del estándar de C++. Por ejemplo, cuando el modificador está establecido y el compilador está en modo/std:c++17
, el valor se expande a201703L
. Para más información, consulte MSVC now correctly reports __cplusplus (Ahora MSVC notifica __cplusplus correctamente).
Biblioteca estándar de C++
Mejoras en la corrección
Visual Studio 2017 RTM (versión 15.0)
- Se han realizado mejoras secundaras en los diagnósticos (
basic_string
_ITERATOR_DEBUG_LEVEL != 0
). Al activar una comprobación de IDL en la maquinaria de cadenas, se indica la conducta específica que provocó la activación. Por ejemplo, en lugar de recibir el mensaje "El iterador de cadena no es desreferenciable", verá el mensaje "No se puede desreferenciar el iterador de cadena porque está fuera del rango (por ejemplo, un iterador final)". - Se ha corregido el operador de asignación de movimiento
std::promise
, que anteriormente podía provocar que el código se bloqueara permanentemente. - Se han corregido errores del compilador con la conversión implícita de
atomic<T*>
aT*
. pointer_traits<Ptr>
ahora detectaPtr::rebind<U>
correctamente.- Se ha corregido la falta de un calificador
const
en el operador de restamove_iterator
. - Se ha corregido un elemento codegen silencioso incorrecto para asignadores con estado definido por el usuario al solicitar
propagate_on_container_copy_assignment
ypropagate_on_container_move_assignment
. atomic<T>
ahora tolera la sobrecarga deoperator&()
.- Se ha mejorado ligeramente el diagnóstico del compilador para llamadas
bind()
incorrectas.
Hay más mejoras de la biblioteca estándar en Visual Studio 2017 RTM. Para ver una lista completa, consulte la entrada sobre las correcciones de la biblioteca estándar en Visual Studio 2017 RTM del blog del equipo de C++.
Visual Studio 2017 versión 15.3
- Los contenedores de la biblioteca estándar ahora fijan su valor de
max_size()
ennumeric_limits<difference_type>::max()
, en lugar demax()
ensize_type
. Este cambio garantiza que el resultado dedistance()
en los iteradores de dicho contenedor se pueda representar en el tipo de valor devuelto dedistance()
. - Se ha corregido la falta de la especialización
auto_ptr<void>
. - Los algoritmos
for_each_n()
,generate_n()
ysearch_n()
antes no se compilaban si el argumento de longitud no era un tipo entero. Ahora permiten convertir las longitudes no integrales al valordifference_type
de los iteradores. normal_distribution<float>
ya no emite advertencias dentro de la biblioteca estándar con respecto a la restricción de "double" a "float".- Se han corregido algunas operaciones
basic_string
que usannpos
en lugar demax_size()
durante la comprobación del desbordamiento de tamaño máximo. condition_variable::wait_for(lock, relative_time, predicate)
permitiría esperar durante todo el período de tiempo relativo en el caso de una reactivación falsa. Ahora solo espera un intervalo único del tiempo relativo.future::get()
ahora permite invalidarfuture
, tal como requiere el estándar.iterator_traits<void *>
solía ser un error porque intentaba formarvoid&
. Ahora se convierte limpiamente en una estructura vacía para permitir el uso deiterator_traits
en condiciones SFINAE "is iterator".- Se han corregido algunas advertencias notificadas por Clang
-Wsystem-headers
. - También se ha corregido el mensaje "la especificación de la excepción en la declaración no coincide con la declaración anterior" notificado por Clang
-Wmicrosoft-exception-spec
. - También se corrigió mem-initializer-list que ordena las advertencias informadas por Clang y C1XX.
- Los contenedores sin ordenar no intercambiaban sus funciones hash o predicados cuando se intercambiaban los propios contenedores. Ahora sí lo hacen.
- Muchas operaciones de intercambio de contenedores ahora están marcadas como
noexcept
, puesto que la biblioteca estándar nunca tiene la intención de generar una excepción al detectar una condición de comportamiento sin definir que no coincida con el asignador y que no sea del tipopropagate_on_container_swap
. - Muchas operaciones
vector<bool>
ahora aparecen marcadas comonoexcept
. - La biblioteca estándar ahora aplica la coincidencia entre el asignador
value_type
(en modo C++17) con un sombreado de escape de rechazo. - Se han corregido algunas condiciones en las que self-range-insert en
basic_string
resolvía el contenido de las cadenas. (Nota: la biblioteca estándar sigue prohibiendo self-range-insert en vectores). basic_string::shrink_to_fit()
ya no se ve afectado por el valorpropagate_on_container_swap
del asignador.std::decay
ahora controla los tipos de funciones abominables, es decir, los tipos de función cv-qualified, ref-qualified o ambos.- Los cambios incluyen directivas para usar la distinción entre mayúsculas y minúsculas y barras diagonales para mejorar la portabilidad.
- Se ha corregido la advertencia C4061: el "enumerador 'enumerator' en la instrucción switch de la enumeración 'enumeration' no está controlado de forma explícita por una etiqueta de caso". Esta advertencia está desactivada de manera predeterminada y se corrigió como una excepción de la directiva general de advertencias de la biblioteca estándar. (La biblioteca estándar está limpia de
/W4
, pero no intenta estar limpia de/Wall
. Muchas advertencias no predeterminadas son muy ruidosas y no están pensadas para usarse de manera regular). - Se han mejorado las comprobaciones de depuración
std::list
. Los iteradores de lista ahora compruebanoperator->()
, ylist::unique()
ahora marca los iteradores como invalidados. - Se ha corregido la metaprogramación uses-allocator en
tuple
.
Versión 15.5 de Visual Studio 2017
std::partition
ahora llama al predicadoN
veces, en lugar deN + 1
, tal y como requiere el estándar.- Los intentos de evitar estáticas mágicas en la versión 15.3 se han reparado en la 15.5.
std::atomic<T>
ya no requiere queT
sea construible de forma predeterminada.- Cuando se habilita la depuración del iterador, los algoritmos de montón que necesiten un valor de tiempo logarítmico ya no realizan una aserción de tiempo lineal en la que la entrada es un montón.
__declspec(allocator)
ahora solo está protegido por C1XX para evitar advertencias de Clang que este elemento desclspec no entiende.basic_string::npos
ahora está disponible como una constante de tiempo de compilación.std::allocator
en C++17 ahora manipula adecuadamente la asignación de tipos sobrealineados, que son aquellos cuya alineación es superior amax_align_t
, a menos que/Zc:alignedNew-
lo deshabilite. Por ejemplo, los vectores de objetos con una alineación de 16 o 32 bytes ahora se alinearán correctamente con instrucciones SSE y AVX.
Mejoras de conformidad
- Se ha agregado <any>, <string_view>,
apply()
ymake_from_tuple()
. - Se ha agregado <optional>, <variant>,
shared_ptr::weak_type
y <cstdalign>. - Se ha habilitado
constexpr
de C++14 enmin(initializer_list)
,max(initializer_list)
,minmax(initializer_list)
,min_element()
,max_element()
yminmax_element()
.
Para más información, vea Conformidad del lenguaje Microsoft C/C++.
Visual Studio 2017 versión 15.3
- Se han implementado otras características de C++17. Para más información, consulte Tabla de conformidad del lenguaje Microsoft C++.
- Se implementó P0602R0 "variante y opcional deben propagar la trivialidad de copia/movimiento".
- La biblioteca estándar ahora tolera de manera oficial que RTTI dinámico se deshabilite mediante la opción /GR-.
dynamic_pointer_cast()
yrethrow_if_nested()
requieren de forma inherentedynamic_cast
, de modo que la biblioteca estándar ahora los marca como=delete
en/GR-
. - Incluso si RTTI dinámico se ha deshabilitado mediante
/GR-
, "RTTI estático" con el formato detypeid(SomeType)
sigue estando disponible y permite potenciar varios componentes de la biblioteca estándar. La biblioteca estándar ahora también admite la deshabilitación de esta característica mediante/D_HAS_STATIC_RTTI=0
. Esta marca también deshabilitastd::any
, las funciones miembrostarget()
ytarget_type()
destd::function
y la función de miembro friendget_deleter()
destd::shared_ptr
ystd::weak_ptr
. - La biblioteca estándar ahora usa
constexpr
de C++14 sin condiciones, en lugar de macros definidas condicionalmente. - La biblioteca estándar ahora usa plantillas de alias de forma interna.
- La biblioteca estándar ahora usa
nullptr
internamente, en lugar denullptr_t{}
. (Se ha erradicado el uso interno de NULL. El uso interno de 0-as-null se está limpiando de forma gradual). - La biblioteca estándar ahora usa
std::move()
internamente, en lugar de hacer un mal uso destd::forward()
de forma estilística. - Se ha cambiado
static_assert(false, "message")
a#error message
. Este cambio mejora los diagnósticos del compilador, porque#error
detiene inmediatamente la compilación. - La biblioteca estándar ya no marca las funciones como
__declspec(dllimport)
. La tecnología de enlazador moderna ya no lo requiere. - Se extrajo SFINAE a argumentos de plantilla predeterminados, lo que reduce el desorden en comparación con los tipos de valor devuelto y los tipos de argumento de función.
- Las comprobaciones de depuración en <random> ahora usan la maquinaria habitual de la biblioteca estándar, en lugar de la función interna
_Rng_abort()
que llamabafputs()
astderr
. La implementación de esta función se ha mantenido para ofrecer compatibilidad binaria. La quitaremos en la siguiente versión sin compatibilidad binaria de la biblioteca estándar.
Versión 15.5 de Visual Studio 2017
- Se han agregado, puesto en desuso o eliminado varias características de la biblioteca estándar según la versión estándar de C++17. Para más información, consulte C++ conformance improvements in Visual Studio (Mejoras de conformidad de C++ en Visual Studio).
- Compatibilidad experimental con los siguientes algoritmos:
all_of
any_of
for_each
for_each_n
none_of
reduce
replace
replace_if
sort
- Se han agregado las firmas para los siguientes algoritmos paralelos, pero por el momento no están paralelizados. En la generación de perfiles no se mostró ninguna ventaja en los algoritmos de paralelización que solo mueven o permutan elementos:
copy
copy_n
fill
fill_n
move
reverse
reverse_copy
rotate
rotate_copy
swap_ranges
Visual Studio 2017, versión 15.6
<memory_resource>
- Conceptos básicos de biblioteca V1
- Eliminación de la asignación
polymorphic_allocator
- Mejora de la deducción de argumentos de plantilla de clase
Visual Studio 2017 versión 15.7
- La compatibilidad con algoritmos paralelos ya no es experimental
- Nueva implementación de
<filesystem>
- Conversiones de cadena elementales (parcial)
std::launder()
std::byte
hypot(x,y,z)
- Evitación de la decadencia innecesaria
- Funciones matemáticas especiales
constexpr char_traits
- Guías de deducción para la biblioteca estándar
Para más información, vea Conformidad del lenguaje Microsoft C/C++.
Correcciones de rendimiento
- Las sobrecargas de
basic_string::find(char)
realizadas solo llaman atraits::find
una vez. Anteriormente, esto se implementaba como una búsqueda general de una cadena de longitud 1. basic_string::operator==
ahora comprueba el tamaño de la cadena antes de comparar su contenido.- Se ha quitado el acoplamiento de control de
basic_string
, ya que era difícil de analizar para el optimizador de compilador. Para todas las cadenas cortas, las llamadas areserve
siguen teniendo un costo distinto de cero para no hacer nada. std::vector
se ha mejorado para aumentar la precisión y el rendimiento: los alias durante las operaciones de inserción y emplazamiento ahora se controlan correctamente según lo requerido por el estándar, y la garantía de excepción sólida ahora se proporciona cuando el estándar lo solicita mediantemove_if_noexcept()
y otra lógica. Además, la inserción y el emplazamiento realizan menos operaciones de elementos.- Ahora, la biblioteca estándar de C++ evita desreferenciar los punteros elaborados nulos.
- Se ha mejorado el rendimiento de
weak_ptr::lock()
. - Para aumentar el rendimiento del compilador, los encabezados de la biblioteca estándar de C++ ahora evitan incluir declaraciones de intrínsecos del compilador innecesarios.
- Se ha triplicado la eficacia del rendimiento de los constructores de movimiento
std::string
ystd::wstring
.
Visual Studio 2017 versión 15.3
- Se ha encontrado una solución alternativa para las interacciones con
noexcept
que impedían insertar la implementación destd::atomic
en funciones que usan Control de excepciones estructurado (SEH). - Se ha cambiado la función interna
_Deallocate()
de la biblioteca estándar para optimizarla en un código más pequeño, lo que permite insertarla en más lugares. - Se ha cambiado
std::try_lock()
para usar la expansión del paquete en lugar de la recursividad. - Se ha mejorado el algoritmo de prevención de interbloqueo
std::lock()
para usar operacioneslock()
en lugar de dar giros entry_lock()
en todos los bloqueos. - Se ha habilitado la optimización del valor devuelto con nombre en
system_category::message()
. conjunction
ydisjunction
ahora crean instancias de tiposN + 1
, en lugar de tipos2N + 2
.std::function
ya no crea instancias de maquinaria de compatibilidad con el asignador para cada elemento invocable con tipo borrado, lo que mejora el rendimiento y disminuye el tamaño de .obj en programas que pasan muchas expresiones lambda distintas astd::function
.allocator_traits<std::allocator>
contiene las operacionesstd::allocator
insertadas manualmente, lo que permite reducir el tamaño del código que interactúa constd::allocator
medianteallocator_traits
, es decir, la mayoría del código.- La biblioteca estándar ahora controla la interfaz de asignador mínimo de C++11 con una llamada directa a
allocator_traits
, en lugar de encapsular el asignador en una clase interna_Wrap_alloc
. Este cambio disminuye el tamaño del código que se genera para la compatibilidad del asignador y mejora la experiencia de depuración y la capacidad del optimizador para razonar sobre los contenedores de la biblioteca estándar en ciertos casos, ya que en el depurador ahora puede ver el tipo de asignador, en lugar de_Wrap_alloc<your_allocator_type>
. - Se ha eliminado la metaprogramación para el elemento personalizado
allocator::reference
, un elemento que los asignadores no tienen permitido personalizar. (Los asignadores pueden hacer que los contenedores usen punteros sofisticados pero no referencias sofisticadas). - El front-end del compilador se diseñó para desencapsular los iteradores de depuración en bucles "range-based for", lo que mejora el rendimiento de las compilaciones de depuración.
- La ruta de reducción interna
basic_string
parashrink_to_fit()
yreserve()
ya no está en la ruta de la reasignación de operaciones, lo que reduce el tamaño del código para todos los miembros de mutación. - La ruta de crecimiento interna
basic_string
ya no está en la ruta deshrink_to_fit()
. - Las operaciones de mutación
basic_string
ahora se factorizan en funciones de ruta lenta de asignación y en funciones de ruta rápida de no asignación, lo que hace más probable que el caso no de reasignación se inserte en los llamadores. - Las operaciones de mutación
basic_string
ahora construyen búferes reasignados con el estado preferido, en lugar de cambiar el tamaño en el mismo lugar. Por ejemplo, la inserción en el comienzo de una cadena ahora mueve el contenido después de la inserción exactamente una vez (ya sea hacia abajo o al búfer recién asignado) en lugar de dos veces en el caso de reasignación (al búfer recién asignado y luego abajo). - Las operaciones que llaman a la biblioteca estándar C en <string> ahora almacenan en caché la dirección
errno
para quitar la interacción repetida con TLS. - Se ha simplificado la implementación de
is_pointer
. - Se ha completado el cambio de la expresión basada en funciones SFINAE para que, en su lugar, se base en
struct
yvoid_t
. - Los algoritmos de la biblioteca estándar ahora evitan el postincremento de los iteradores.
- Se corrigieron las advertencias de truncamiento cuando se usan asignadores de 32 bits en sistemas de 64 bits.
- La asignación de movimiento
std::vector
ahora es más eficaz en el caso de los asignadores que no coincidan y que no sean POCMA, ya que permite volver a usar el búfer cuando es posible.
Versión 15.5 de Visual Studio 2017
basic_string<char16_t>
ahora interactúa en las mismas optimizaciones dememcmp
,memcpy
y similares quebasic_string<wchar_t>
.- Una limitación del optimizador que impedía que los punteros de funciones se expusiesen insertados con el trabajo "evitar la copia de funciones" en Visual Studio 2015 Update 3, se ha corregido temporalmente mediante la restauración del rendimiento de
lower_bound(iter, iter, function pointer)
. - La sobrecarga de la verificación del orden de depuración del iterador de entradas en
includes
,set_difference
,set_symmetric_difference
yset_union
se ha reducido mediante el desempaquetado de iteradores antes de comprobar el orden. std::inplace_merge
ahora omite elementos que ya están en posición.- La construcción de
std::random_device
ya no construye y destruyestd::string
. std::partition
ystd::equal
incluían un pase de optimización de procesamiento por saltos que ahorra una comparación del iterador.- Ahora, cuando se pasan punteros a
std::reverse
para elementosT
copiables de forma trivial, este realiza distribuciones a una implementación vectorizada escrita a mano. std::fill
,std::equal
ystd::lexicographical_compare
ahora permiten la distribución amemset
ymemcmp
parastd::byte
ygsl::byte
, así como en el caso de otras enumeraciones del tipo char y clases enum. Puesto questd::copy
se envía medianteis_trivially_copyable
, no necesita ningún cambio.- La biblioteca estándar ya no contiene destructores de paréntesis vacíos, cuyo único comportamiento era hacer que los tipos no fueran destruibles de forma trivial.
Otras bibliotecas
Compatibilidad con bibliotecas de código abierto
Vcpkg es una herramienta de línea de comandos de código abierto que simplifica enormemente el proceso de adquirir y compilar bibliotecas estáticas de C++ de código abierto y archivos DLL en Visual Studio. Para obtener más información, vea vcpkg.
CppRestSDK 2.9.0
Versión 15.5 de Visual Studio 2017
Se ha actualizado CppRestSDK (una API web multiplataforma para C++) a la versión 2.9.0. Para obtener más información, vea CppRestSDK 2.9.0 is available on GitHub (CppRestSDK 2.9.0 está disponible en GitHub).
ATL
Versión 15.5 de Visual Studio 2017
- Otro conjunto de correcciones de conformidad para la búsqueda de nombres.
- Los operadores de constructores de movimiento y de asignación de movimiento están ahora correctamente marcados como no productores de excepciones.
- Inclusión de la advertencia válida C4640 sobre la inicialización segura para subprocesos de elementos estáticos locales en atlstr.h.
- La inicialización segura para subprocesos de elementos estáticos locales se desactivó automáticamente en el conjunto de herramientas de XP al usar ATL para compilar un archivo DLL. Pero ahora no. Puede agregar
/Zc:threadSafeInit-
en la configuración del proyecto si no desea la inicialización segura para subprocesos.
Runtime de Visual C++
- Nuevo encabezado "cfguard.h" para símbolos de protección de flujo de control.
C++ IDE de Visual Studio 2017
- El rendimiento del cambio de configuración ahora es mejor para proyectos nativos de C++ y mucho mejor para proyectos C++/CLI. Cuando se activa una configuración de solución por primera vez, ahora es más rápida y todas las activaciones posteriores de esta configuración de la solución serán casi instantáneas.
Visual Studio 2017 versión 15.3
- Algunos asistentes de código y proyecto se han vuelto a escribir en el estilo del cuadro de diálogo de signatura.
- Ahora, al usar la opción Agregar clase se abre directamente el Asistente para agregar clases. Todos los demás elementos que estaban previamente aquí se encuentran disponibles ahora en Agregar > Nuevo elemento.
- Ahora los proyectos de Win32 están en la categoría Escritorio de Windows en el cuadro de diálogo Nuevo proyecto.
- Ahora las plantillas de la consola de Windows y de la aplicación de escritorio crean proyectos sin abrir un asistente. Hay un nuevo Asistente de escritorio de Windows en la misma categoría que muestra las mismas opciones que el asistente Aplicación de consola Win32 anterior.
Versión 15.5 de Visual Studio 2017
Ahora varias operaciones de C++ que usan el motor IntelliSense para la refactorización y la navegación de código se ejecutan mucho más rápido. Los siguientes números se basan en la solución de Chromium de Visual Studio con 3500 proyectos:
Característica | Mejora del rendimiento |
---|---|
Cambiar nombre | 5,3x |
Cambiar firma | 4,5x |
Buscar todas las referencias | 4,7x |
Ahora C++ permite hacer clic presionando la tecla Control para ir a la definición, lo que hace más sencilla la navegación con el mouse a las definiciones. El Visualizador de estructuras del paquete Productivity Power Tools hora también se incluye en el producto de forma predeterminada.
IntelliSense
Ahora se está usando el nuevo motor de base de datos basado en SQLite de forma predeterminada. El nuevo motor acelera las operaciones de base de datos como Ir a la definición y Buscar todas las referencias y mejora considerablemente el tiempo de análisis de la solución inicial. La configuración se ha movido a Herramientas > Opciones > Editor de texto > C/ C++ > Avanzado. (Anteriormente se encontraba en... C/C++ > Experimental).
Se ha mejorado el rendimiento de IntelliSense en proyectos y archivos que no utilizan encabezados precompilados; se crea un encabezado precompilado automático para los encabezados en el archivo actual.
Se ha agregado el filtro de errores y la ayuda para errores de IntelliSense en la lista de errores. Ahora se puede filtrar al hacer clic en la columna de errores. Además, al hacer clic en los errores específicos o al presionar F1, se inicia una búsqueda en línea del mensaje de error.
Se agregó la capacidad de filtrar los elementos de la lista de miembros por tipo.
Se ha agregado una nueva característica de IntelliSense predictiva experimental que proporciona un filtrado de lo que aparece en la lista de miembros que tiene en cuenta el contexto. Para más información, consulte C++ IntelliSense Improvements - Predictive IntelliSense & Filtering (Mejoras de IntelliSense de C++: IntelliSense predictivo y filtrado).
Ahora Buscar todas las referencias (Mayús+F12) permite desplazarse con facilidad, incluso en códigos base complejos. Proporciona agrupación avanzada, filtrado, ordenación, búsqueda en los resultados y (para algunos idiomas) uso de colores, para que pueda entender claramente las referencias. Para C++, la nueva interfaz de usuario incluye información sobre si se lee desde una variable o si se escribe en ella.
La característica Punto a flecha de IntelliSense pasa de experimental a avanzada y ahora está habilitada de manera predeterminada. Las características del editor Expandir ámbitos y Expandir precedencia también han pasado de características experimentales a avanzadas.
Las características experimentales de refactorización Cambiar signatura y Extraer función ahora están disponibles de manera predeterminada.
Se ha agregado una característica experimental "Carga de proyecto más rápida" para proyectos de C++. La próxima vez que abra un proyecto de C++, se cargará más rápido y la siguiente todavía más.
Algunas de estas características son comunes a otros lenguajes y otras son específicas de C++. Para más información sobre estas nuevas características, consulte Announcing Visual Studio "15" (Presentación de Visual Studio "15").
Visual Studio 2017 versión 15.7
- se ha agregado compatibilidad para ClangFormat. Para obtener más información, vea ClangFormat Support in Visual Studio 2017 (Compatibilidad con ClangFormat en Visual Studio 2017).
Proyectos que no son de MSBuild con Abrir carpeta
Visual Studio 2017 presenta la característica Abrir carpeta, que permite codificar, compilar y depurar elementos en una carpeta que contenga código fuente sin necesidad de crear soluciones o proyectos. Ahora es más fácil empezar a trabajar con Visual Studio, incluso si el proyecto no es un proyecto basado en MSBuild. Abrir carpeta proporciona acceso a funcionalidades eficaces de reconocimiento, edición, compilación y depuración. Son las mismos que ya proporciona Visual Studio para los proyectos de MSBuild. Para más información, vea el artículo sobre los proyectos Abrir carpeta para C++.
- Mejoras en la experiencia de Abrir carpeta. Puede personalizar la experiencia con estos archivos .json:
- CppProperties.json para personalizar la experiencia de IntelliSense y de exploración.
- Tasks.json para personalizar los pasos de compilación.
- Launch.json para personalizar la experiencia de depuración.
Visual Studio 2017 versión 15.3
- Se mejoró la compatibilidad con compiladores alternativos y entornos de compilación como MinGW y Cygwin. Para más información, consulte el artículo sobre el uso de MinGW y Cygwin con Visual C++ y Abrir carpeta.
- Se ha agregado compatibilidad para definir variables de entorno globales y específicas de la configuración en CppProperties.json y CMakeSettings.json. Estas variables de entorno se pueden usar en las configuraciones de depuración definidas en launch.vs.json y en las tareas tasks.vs.json. Para obtener más información, vea Customizing your Environment with Visual C++ and Open Folder (Personalización del entorno con Visual C++ y Abrir carpeta).
- Se mejoró la compatibilidad con el generador Ninja de CMake, incluida la capacidad de apuntar fácilmente a las plataformas de 64 bits.
Compatibilidad con CMake mediante Abrir carpeta
Visual Studio 2017 incluye compatibilidad con el uso de proyectos CMake sin convertirlos en archivos de proyecto de MSBuild (.vcxproj). Para más información, vea el artículo sobre proyectos de CMake en Visual Studio. Si abre proyectos CMake con Abrir carpeta, el entorno se configurará automáticamente para la edición, la compilación y la depuración de C++.
IntelliSense de C++ funciona sin la necesidad de crear un archivo CppProperties.json en la carpeta raíz. Hemos agregado un nuevo menú desplegable que permite a los usuarios cambiar fácilmente entre las configuraciones que proporcionan los archivos CMake y CppProperties.json.
Se admite una configuración adicional a través de un archivo CMakeSettings.json que reside en la misma carpeta que el archivo CMakeLists.txt.
Visual Studio 2017 versión 15.3
- se ha agregado compatibilidad para el generador CMake Ninja.
Visual Studio 2017, versión 15.4
- se ha agregado compatibilidad para la importación de las memorias caché de CMake existentes.
Versión 15.5 de Visual Studio 2017
- se ha agregado compatibilidad para CMake 3.11, el análisis de código en proyectos de CMake, la vista de destinos en el Explorador de soluciones, las opciones de generación de caché y la compilación de archivo único. Para obtener más información, vea CMake Support in Visual Studio (Compatibilidad con CMake en Visual Studio) y Proyectos de CMake en Visual Studio.
Desarrollo de escritorio para Windows
Ahora se proporciona una experiencia de instalación más granular para la instalación de la carga de trabajo original de C++. Hemos agregado componentes seleccionables que permiten instalar únicamente las herramientas que necesita. Los tamaños de instalación indicados para los componentes enumerados en la UI del instalador son incorrectos y subestiman el tamaño total.
Para crear correctamente proyectos de Win32 en la carga de trabajo de escritorio de C++, debe instalar un conjunto de herramientas y un SDK de Windows. Instale los componentes recomendados (seleccionados), que son el conjunto de herramientas de VC++ 2017 v141 (x86, x64) y Windows 10 SDK (10.0.nnnnn) para asegurarse de que funcionan. Si no se instalan las herramientas necesarias, los proyectos no se crearán correctamente y el asistente deja de responder.
Versión 15.5 de Visual Studio 2017
Visual C++ Build Tools (anteriormente disponible como un producto independiente) ahora se incluye como carga de trabajo en el instalador de Visual Studio. Esta carga de trabajo instala solo las herramientas necesarias para compilar proyectos de C++ sin tener que instalar el IDE de Visual Studio. Se incluyen los conjuntos de herramientas v140 y v141. El conjunto de herramientas v141 contiene las últimas mejoras de la versión 15.5 de Visual Studio 2017. Para obtener más información, vea Visual Studio Build Tools now include the VS2017 and VS2015 MSVC Toolsets (Visual Studio Build Tools ahora incluye los conjuntos de herramientas VS2017 y VS2015).
Desarrollo para Linux con C++
La extensión popular Visual C++ for Linux Development ya forma parte de Visual Studio. Esta instalación proporciona todo lo que necesita para desarrollar y depurar aplicaciones de C++ que se ejecutan en un entorno de Linux.
Visual Studio 2017, versión 15.2
Se han realizado mejoras para el uso compartido de código multiplataforma y visualización de tipos. Para más información, consulte las mejoras en Linux C++ para el uso compartido de código multiplataforma y visualización de tipos.
Versión 15.5 de Visual Studio 2017
- La carga de trabajo de Linux presenta más opciones de compatibilidad con rsync como alternativa a sftp para sincronizar archivos en máquinas remotas Linux.
- Se ha agregado compatibilidad para compilación cruzada con destinos de microcontroladores ARM. Para habilitarla en la instalación, seleccione la carga de trabajo Desarrollo de Linux con C++ y seleccione la opción Desarrollo incrustado e IoT. Esta opción agrega a su instalación las herramientas de compilación cruzada GCC de ARM y Make. Para obtener más información, vea ARM GCC Cross Compilation in Visual Studio (Compilación cruzada de GCC de ARM en Visual Studio).
- Se ha agregado compatibilidad para CMake. Ahora puede trabajar en su base de código CMake sin tener que convertirla a un proyecto de Visual Studio. Para obtener más información, vea Configure a Linux CMake Project (Configuración de un proyecto CMake de Linux).
- Se ha agregado compatibilidad para la ejecución de tareas remotas. Esta capacidad le permite ejecutar cualquier comando en un sistema remoto que se defina en el Administrador de conexiones de Visual Studio. Las tareas remotas también proporcionan la capacidad de copia de archivos en el sistema remoto. Para obtener más información, vea Configure a Linux CMake Project (Configuración de un proyecto CMake de Linux).
Visual Studio 2017 versión 15.7
- Varias mejoras en escenarios de carga de trabajo de Linux. Para obtener más información, vea Linux C++ Workload improvements to the Project System, Linux Console Window, rsync and Attach to Process (Mejoras de carga de trabajo de C++ de Linux para el sistema de proyectos, la ventana de la consola de Linux, rsync y Asociar al proceso).
- IntelliSense para encabezados en conexiones remotas de Linux. Para obtener más información, vea IntelliSense for Remote Linux Headers (IntelliSense para encabezados remotos de Linux) y Configuración de un proyecto de CMake de Linux.
Desarrollo de juegos con C++
Utilice toda la capacidad de C++ para crear juegos profesionales con tecnología de DirectX o Cocos2d.
Desarrollo móvil con C++ (Android y iOS)
Ahora puede crear y depurar aplicaciones móviles con Visual Studio que pueden tener como destino iOS y Android.
Aplicaciones Windows universales
C++ viene como un componente opcional de la carga de trabajo de la Aplicación Windows universal. Actualmente, debe actualizar los proyectos de C++ manualmente. Puede abrir un proyecto de la Plataforma universal de Windows destinado a v140 en Visual Studio 2017. Sin embargo, deberá seleccionar el conjunto de herramientas de la plataforma v141 en las páginas de propiedades del proyecto si no tiene instalado Visual Studio 2015.
Nuevas opciones de C++ en la Plataforma universal de Windows (UWP)
Ahora tiene nuevas opciones para escribir y empaquetar aplicaciones C++ para la Plataforma universal de Windows y Microsoft Store: La infraestructura Puente de dispositivo de escritorio permite empaquetar el objeto COM o la aplicación de escritorio existentes para su implementación a través de la Tienda Windows, o mediante los canales existentes vía la instalación de prueba. Las nuevas capacidades de Windows 10 le permiten agregar funcionalidad de Plataforma universal de Windows a su aplicación de escritorio de varias maneras. Para obtener más información, vea Puente de dispositivo de escritorio.
Versión 15.5 de Visual Studio 2017
Se ha agregado una plantilla de proyecto Proyecto de paquete de aplicación de Windows, lo que simplifica en gran medida la tarea de empaquetar aplicaciones de escritorio mediante el uso del Puente de dispositivo de escritorio. Está disponible en Archivo | Nuevo | Proyecto | Instalado | Visual C++ | Plataforma universal de Windows. Para obtener más información, consulte Empaquetar una aplicación mediante Visual Studio (Puente de dispositivo de escritorio a UWP).
Al escribir código nuevo, ahora puede usar C++/WinRT, una proyección del lenguaje C++ estándar para Windows Runtime que se implementa solamente en los archivos de encabezado. Permite consumir y usar las API de Windows Runtime con cualquier compilador de C++ cumple con los estándares. C++/WinRT está diseñado para proporcionar a los desarrolladores de C++ acceso de primera a la API de Windows moderna. Para obtener más información, consulte C++/WinRT.
A partir de la compilación 17025 de Windows SDK Insider Preview, C++/WinRT está incluido en Windows SDK. Para obtener más información, vea C++/WinRT is now included the Windows SDK (Ahora se incluyen C++/WinRT en Windows SDK).
Conjunto de herramientas de la plataforma Clang/C2
El conjunto de herramientas Clang/C2 que se incluye con Visual Studio 2017 ahora es compatible con el modificador /bigobj
, que es fundamental para la creación de proyectos grandes. También incluye varias correcciones de errores importantes, tanto en el front-end y el back-end del compilador.
Análisis de código de C++
Ahora se distribuyen con Visual Studio los comprobadores principales de C++ para aplicar las directrices principales de C++. Habilite los comprobadores en la página Extensiones de análisis de código en las páginas de propiedades del proyecto y las extensiones se incluirán al ejecutar análisis de código. Para más información, consulte Usar los comprobadores de directrices principales de C++.
Visual Studio 2017 versión 15.3
- Se ha agregado compatibilidad con reglas relativas a la administración de recursos.
Versión 15.5 de Visual Studio 2017
Las nuevas comprobaciones de C++ Core Guidelines cubren la exactitud del puntero inteligente, el uso adecuado de inicializadores globales y la marca de usos de construcciones como
goto
y conversiones incorrectas.Algunos números de advertencias que puede encontrar en 15.3 ya no están disponibles en 15.5. Estas advertencias se han sustituido por comprobaciones más específicas.
Visual Studio 2017, versión 15.6
- Se ha agregado compatibilidad para el análisis de archivo único y mejoras en el rendimiento en tiempo de ejecución de los análisis. Para obtener más información, vea C++ Static Analysis Improvements for Visual Studio 2017 15.6 Preview 2 (Mejoras de análisis estático de C++ para Visual Studio de 2017 15.6 [versión preliminar 2])
Visual Studio 2017 versión 15.7
- Se ha agregado compatibilidad con
/analyze:ruleset
, que permite especificar las reglas de análisis de código que se van a ejecutar. - Se ha agregado compatibilidad para más reglas de C++ Core Guidelines. Para más información, consulte Usar los comprobadores de directrices principales de C++.
Pruebas unitarias en Visual Studio 2017
Versión 15.5 de Visual Studio 2017
Google Test Adapter y Boost.Test Adapter ahora están disponibles como componentes de la carga de trabajo Desarrollo para el escritorio con C++ y se integran con el Explorador de pruebas. Se ha agregado compatibilidad con CTest para proyectos CMake (con Abrir carpeta), aunque todavía no está disponible la integración completa con el Explorador de pruebas. Para obtener más información, vea Writing unit tests for C/C++ (Escritura de pruebas unitarias para C/C++).
Visual Studio 2017, versión 15.6
- Se ha agregado compatibilidad con
Boost.Test
para admitir la biblioteca dinámica de Boost.Test. - Ahora en el IDE hay una plantilla de elemento
Boost.Test
disponible.
Para obtener más información, consulte Boost.Test
Unit Testing: Dynamic Library support and New Item Template (Pruebas unitarias de Boost.Test: compatibilidad con bibliotecas dinámicas y nueva plantilla de elemento).
Visual Studio 2017 versión 15.7
Se ha agregado compatibilidad con CodeLens para proyectos de pruebas unitarias de C++. Para obtener más información, vea Announcing CodeLens for C++ Unit Testing (Anuncio de CodeLens para pruebas unitarias de C++).
Diagnóstico de gráficos de Visual Studio
Herramientas de Diagnóstico de gráficos de Visual Studio: puede usarlas para registrar y analizar problemas de representación y rendimiento en aplicaciones de Direct3D. Úselas en aplicaciones que se ejecutan localmente en su PC Windows, en un emulador de dispositivos de Windows o en un dispositivo o equipo remoto.
Entrada y salida para sombreadores de vértices y geometría: la función para ver la entrada y la salida de los sombreadores de vértices y de geometría ha sido una de las más solicitadas. y ahora se admite en las herramientas. Seleccione la fase VS (sombreadores de vértices) o GS (sombreadores de geometría) en la vista Etapas de canalización para empezar a inspeccionar su entrada y su salida en la tabla siguiente.
Búsqueda y filtrado en la tabla de objetos: proporciona un modo rápido y sencillo de encontrar los recursos que se buscan.
Historial de recursos: esta nueva vista proporciona una manera simplificada de ver el historial completo de modificaciones de un recurso tal como se usó durante el procesamiento de un fotograma capturado. Para invocar el historial de un recurso, haga clic en el icono de reloj que se encuentra junto a los hipervínculos de recursos.
De este modo, se mostrará la nueva ventana de herramientas Historial de recursos, rellenada con el historial de cambios del recurso.
Puede capturar fotogramas con la captura de pila de llamadas completa habilitada. De ese modo, se puede deducir rápidamente el contexto de cada evento de cambio e inspeccionarlo dentro del proyecto de Visual Studio. Establezca la opción de captura de pila de llamadas completa en el cuadro de diálogo de Visual Studio Herramientas > Opciones, en Diagnóstico de gráficos.
Estadísticas de API: vea un resumen de alto nivel del uso de la API en su fotograma. Puede ser útil para detectar llamadas que tal vez no sepa que realiza o para detectar llamadas que realiza demasiado a menudo. Esta ventana está disponible en Ver > Estadísticas de API en el Analizador de gráficos de Visual Studio.
Estadísticas de memoria: vea cuánta memoria asigna el controlador a los recursos que crea en el fotograma. Esta ventana está disponible en Ver > Estadísticas de memoria en el Analizador de gráficos de Visual Studio. Para copiar datos en un archivo CSV para verlos en una hoja de cálculo, haga clic con el botón derecho y elija Copiar todo.
Validación de fotogramas: la nueva lista de errores y advertencias proporciona una manera fácil de navegar por la lista de eventos en función de los posibles problemas que haya detectado la capa de depuración de Direct3D. Haga clic en Ver > Validación de fotogramas en el Analizador de gráficos de Visual Studio para abrir la ventana. Después, haga clic en Ejecutar validación para comenzar el análisis. Puede tardar varios minutos en completarse, en función de la complejidad del fotograma.
Análisis de fotogramas para D3D12: use el análisis de fotogramas para analizar el rendimiento de las llamadas a draw con experimentos "y si" dirigidos. Cambie a la pestaña Análisis de fotogramas y ejecute un análisis para ver el informe.
Mejoras de uso de GPU: abra los seguimientos que pueden ser realizados mediante el Generador de perfiles de uso de GPU de Visual Studio con la herramienta Vista de GPU o Windows Performance Analyzer (WPA) para obtener análisis más detallados. Si tiene instalado Windows Performance Toolkit, hay dos hipervínculos, uno para WPA y otro para Vista de GPU, en la parte inferior derecha de la información general de la sesión.
Los seguimientos abiertos en Vista de GPU a través de este vínculo admiten el zoom de escala de tiempo y el movimiento panorámico sincronizados entre Visual Studio y Vista de GPU. Una casilla de Visual Studio controla si la sincronización está habilitada o no.