Características C++11 (C++ moderno)
Este documento describe las características de la nueva norma-también de C++ conocida como C++11-that se implementa en Visual C++.
Características de lenguaje básicas C++11
Visual C++ 2010 implementó muchas características en la especificación básica del lenguaje C++0x, a la que fue el predecesor C++11, y Visual C++ en Visual Studio 2012 expanda en que para incluir muchas características C++11.La tabla siguiente se muestran las características de lenguaje básicas C++11 y su estado de implementación en Visual C++ 2010 y Visual C++ en Visual Studio 2012.
V C10 |
V C11 |
|
---|---|---|
v2.0 |
v2.1* |
|
No |
No |
|
No |
No |
|
No |
No |
|
No |
No |
|
Sí |
Sí |
|
v1.0 |
v1.0 |
|
Sí |
Sí |
|
v1.0 |
v1.1 |
|
v1.0 |
v1.1 ** |
|
Sí |
Sí |
|
Argumentos de plantilla predeterminados para las plantillas de función |
No |
No |
No |
No |
|
No |
No |
|
Sí |
Sí |
|
Sí |
Sí |
|
Partial |
Sí |
|
No |
Sí |
|
No |
No |
|
No |
No |
|
TR1 |
Partial |
|
No |
No |
|
No |
No |
|
No |
No |
|
No |
No |
|
No |
No |
|
No |
No |
|
No |
No |
|
No |
No |
|
No |
Sí |
|
No |
No |
|
Sí |
Sí |
|
No |
No |
|
No |
No |
|
No |
No |
|
Sí |
Sí |
|
No |
Sí |
|
Partial |
Sí |
|
Sí |
Sí |
|
No |
No |
Características de lenguaje básicas C++11: Simultaneidad |
V C10 |
V C11 |
---|---|---|
N/D |
N/D |
|
No |
Sí |
|
No |
Sí |
|
No |
Sí |
|
N/D |
N/D |
|
No |
Sí |
|
No |
No |
|
Sí |
Sí |
|
No |
No |
|
No |
No |
|
Partial |
Partial |
|
No |
No |
Características de lenguaje básicas C++11: C99 |
V C10 |
V C11 |
---|---|---|
Partial |
Partial |
|
Partial |
Partial |
|
Sí |
Sí |
|
N/D |
N/D |
Ésta es una guía rápida a la información de las tablas.
Referencias Rvalue
N1610 “Clarification de inicialización de objetos de clase por los valores r” era un intento temprano de habilitar la semántica de transferencia de recursos sin referencias rvalue.En este tutorial, se denominará “rvalue hace referencia v0.1.” Se ha reemplazado por “referencias v1.0 rvalue.” “Rvalue hace v2.0 referencia”, que es lo que se basaba el trabajo en Visual C++ 2010 en, prohíbe referencias rvalue enlazarlos a los son y por tanto para corregir un problema de seguridad importante. "Las referencias v2.1 Rvalue “refinan esta regla.Considere vector<string>::push_back(), que tiene las sobrecargas push_back(const string&) y push_back(string&&); la llamada v.push_back("strval").La expresión "strval" es un literal de cadena, y es un valor l.(Otros literales, por ejemplo el entero 1729, son valores r, pero los literales de cadena son especiales porque son matrices). Las reglas de las referencias v2.0 rvalue dijo, string&& no puede enlazar a "strval" porque "strval" es un valor l y, por consiguiente, push_back(const string&) es la única sobrecarga viable.Esto crearía std::string temporal, se copia en el vector, y después destruye std::string temporal.Esto no es muy eficaz.Las reglas de las referencias v2.1 rvalue reconocen que enlazar string&& a "strval" crearía std::string temporal, y que temporal es un valor rvalue.Por consiguiente, push_back(const string&) y push_back(string&&) son viables, y se prefiere push_back(string&&).std::string temporal se crea, y se mueve a vector.Esto es más eficaz.
“Las referencias v3.0 Rvalue” agregan nuevas reglas para generar automáticamente constructores de movimiento y mover a operadores de asignación en determinadas condiciones.Sin embargo, esto no se implementa en Visual C++ en Visual Studio 2012, debido a restricciones de tiempo y de recursos.
Precaución |
---|
Los v0.1, v1.0, v2.0, v2.1, designaciones v3.0 se inventan para mayor claridad y mostrar la evolución de C++11. |
Lambdas
Después de que funciones lambda fuera votado en el Paper que funcionaba (versión 0,9) y las expresiones lambda mutables se agregaron (versión 1,0), el comité de Standardization revisada el texto.Esto genera lambdas versión 1,1.Esto produce demasiado tarde para mostrarlo en línea en Visual C++ 2010, pero está en Visual C++ en Visual Studio 2012.El texto de las expresiones lambda v1.1 explica qué debe aparecer en los casos de la esquina como de hacer referencia a los miembros estáticos o a las expresiones lambda anidada.Esto corrige los errores que son desencadenados por lambdas complejos.Además de Visual C++ en Visual Studio 2012, las expresiones lambda estado son convertibles a punteros a función.Esto no está en el texto N2927, pero se cuentan como parte de las expresiones lambda v1.1 de todos modos.FDIS 5.1.2 []/6 de expr.prim.lambda tiene esta descripción: “El tipo de cierre para obtener una expresión lambda sin lambda- captura tiene una función de conversión no explícita no virtual pública const al puntero a función tiene el mismo parámetro y tipos de valor devuelto que el operador de llamada de función del tipo de cierre.El valor devuelto por esta función de conversión de la dirección de una función que, cuando se invoca, tiene el mismo efecto que al operador de llamada de función del tipo de cierre”. ( Visual C++ en Visual Studio 2012 incluso es mejor que, dado que hemos creado lambdas estado convertibles a punteros a función que tienen convenciones de llamada arbitrarias.Esto es importante cuando se utiliza API que cuenta con elementos como los punteros a función de __stdcall .)
decltype
Después de que el decltype fuera votado en el Paper que funcionaba (versión 1,0), recibió una corrección de errores pequeña pero importante a actualizada (versión 1,1).Esto es de gran interés para los programadores que trabajan en STL y el Boost.
Enumeraciones fuertemente tipados/hacia delante declarados
Enumeraciones fuertemente tipados se admiten parcialmente en Visual C++ 2010 (específicamente, la parte sobre tipos subyacentes especificados explícitamente).Visual C++ en Visual Studio 2012 los completamente implementado, y también implementa totalmente la semántica C++11 para reenvíe las enumeraciones declarados.
Alineación
Ni Visual C++ 2010 ni implementar de Visual C++ en Visual Studio 2012 las palabras clave básicas alignas/alignofofrecen de alineación programado que se votado en el Paper que funcionaba.Visual C++ 2010 tenía aligned_storage de TR1.Visual C++ en Visual Studio 2012 agrega aligned_union y std::align() a la biblioteca estándar.
Norma-diseño y tipos de Trivial
Los cambios expuestos de “VAINA N2342 nueva; Resolver el punto central 568 (revisión 5)” son las adiciones de is_trivial y de is_standard_layout a <type_traits>.(N2342 devueltos a la del texto básica de idioma, pero no hay cambios de compilador necesarios). Estos rasgos de tipo estaban disponibles en Visual C++ 2010, pero terminan de duplicar is_pod.Por consiguiente, la tabla anterior en este documento dijo “no” compatibilidad.En Visual C++ en Visual Studio 2012, son accionados por los enlaces de compilador que están diseñados para permitir respuestas exactas.
reemplazo y final
Esto pasa con una evolución corta pero complicada., En versión 0,8, había originalmente [[override]], [[hiding]], y [[base_check]] atributos.A continuación en versión 0,9, los atributos eliminados y reemplazan con palabras clave contextuales.Por último, en versión 1,0, se reducidos a “final” en clases, y “override” y “final” en funciones.Esto le crea una extensión de Ascended porque Visual C++ 2010 admitía ya esta sintaxis de “override” en funciones, y tenía semántica bastante cerca de los de C++11. "final” también se admite, pero mediante diferente ortografía “selló”.En Visual Studio 2012, la ortografía y la semántica estándar de “override” y “final” se admiten por completo.Para obtener más información, vea override (especificador) y final (especificador).
Física nuclear, y Más
Física nuclearpara comparar y cambiebarreras bidireccionales, y el orden de la dato- dependencia especifique la maquinaria de la biblioteca estándar, que se implementan en Visual C++ en Visual Studio 2012.
Características estándar de biblioteca
Que cubre el lenguaje básico.En cuanto a la biblioteca estándar C++11, no tenemos una tabla descriptiva de características, pero Visual C++ en Visual Studio 2012 la implementa, con dos excepciones.Primero, cuando una característica de biblioteca depende de la funcionalidad que falta en el compilador, cualquiera simulamos a requerir- para el ejemplo, se simula las plantillas variadic para make_shared<T>()— o no lo implementamos - que estamos pocos casos, sobre todo, <initializer_list>.En segundo lugar, la biblioteca estándar de C99, que es escrita por referencia de la biblioteca estándar C++11, es principalmente implementados, aunque <stdint.h> fuera implementado en Visual C++ 2010.A continuación se muestra una lista parcial de los cambios en Visual C++ en Visual Studio 2012:
Nuevos encabezados:<atomic>, <chrono>, <condition_variable>, <future>, <mutex>, <ratio>, <scoped_allocator>, y <thread>.
Emplazamiento: As Requerido Por C++11, emplace()/emplace_front()/emplace_back()/emplace_hint()/emplace_after() se implementa en todos los contenedores para los números “arbitrarios” de argumentos (vea la sección “false variadics”).Por ejemplo, vector<T> tiene “template <typename... Args> void emplace_back(Args&&... args)” que construye directamente un elemento de tipo t en la reproducción del vector de un número arbitrario de argumentos arbitrarios, reenviado perfectamente.Esto puede ser más eficaz que push_back(T&&), que implican una construcción y una destrucción adicionales de movimiento.
**False variadics:**Visual C++ en Visual Studio 2012 tiene un nuevo esquema para simular las plantillas variadic.En Visual C++ 2008 SP1 y Visual C++ 2010, los subheaders estaban incluidos repetidamente con las macros definidas diferente cada vez, las sobrecargas de marca out para 0, 1, 2, 3, o varios argumentos.Por ejemplo, <memory> incluía el subheader interno <xxshared> repetidamente, el registro out make_shared<T>(args, args, args).En Visual C++ en Visual Studio 2012, se van los subheaders.Ahora las plantillas variadic propios se definen como macros (con las partes de barra diagonal inversa- continuaciones), y se expanden utilizando las macros principales.Este cambio interno de implementación tiene estos efectos:
El código es más fácil de mantener, más fácil de utilizar (los subheaders de suma eran una cantidad no despreciable de trabajo), y más legible.
¡Es más difícil entrar en con el depurador- triste!
El constructor de pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) de std::pair tiene efectos “interesantes”.Esto requiere las sobrecargas N^2 (si admitimos hasta 10 tuplas, esas significa 121 sobrecargas, porque las tuplas vacíos cuentan aquí, también).
Mandando spam out en muchas sobrecargas de par- tupla, además de todas las sobrecargas de ellas, consumió una enorme cantidad de memoria durante la compilación.Por consiguiente, redujimos infinito.En Visual C++ 2008 SP1 y Visual C++ 2010, infinito fuera 10 (es decir, las plantillas “variadic” admitidos 0 a 10 argumentos, inclusivos).De forma predeterminada, infinito es 5 en Visual C++ en Visual Studio 2012.Esto coloca el consumo de memoria del compilador de nuevo cuál era en Visual C++ 2010.Si necesita más argumentos (por ejemplo, si tiene código existente que usa 6 tuplas), hay un sombreado de escape.Puede definir _VARIADIC_MAX proyecto- ancho entre 5 y 10 inclusive.Esto utiliza más memoria, y puede requerir que se usa la opción del compilador /Zm de reservar más espacio para los encabezados precompilados.
**Aleatoriedad:**uniform_int_distribution es absolutamente imparcial ahora, y shuffle() se implementa en <algorithm>, que acepta directamente el número aleatorio uniforme Generadores como mersenne_twister.
Resistencia dirección-de sobrecargado operators: C++98/03 prohibió un elemento de un contenedor de STL de sobrecarga del dirección- de operator.Esto es lo que realizan las clases como CComPtr, de modo que las clases auxiliares como CAdapt fueran necesarias al proteger STL de estas sobrecargas.Durante el desarrollo de Visual C++ 2010, STL cambia creado que rechaza a dirección- de sobrecargado operators en incluso más escenarios.C++11 cambió los requisitos para crear a dirección- de sobrecargado operators aceptable.C++11, y Visual C++ 2010, proporcionan la función std::addressof() auxiliar, que se puede obtener la dirección real de un objeto independientemente de sobrecarga de operadores.Antes de que Visual C++ 2010 fuera liberado, se intenta reemplazar apariciones de “&elem” con “std::addressof(elem)”, que es adecuado resistente.En Visual C++ en Visual Studio 2012, hemos ido más consultas.Ya hemos auditado todos los contenedores y todos los iteradores, de modo que las clases que sobrecargan al dirección- de operator deben utilizar en STL.
Visual C++ en Visual Studio 2012 va más allá de C++11 de varias maneras:
Iteradores de SCARY: permitida pero no requerido por C++11 standard, iteradores de SCARY se ha implementado, como se describe por Dependencias de N2911 “Minimizing dentro de las clases de Genéricos para los programas de Faster y de Smaller” y “Asignar y inicialización, la revisión 1 " del iterador de SCARY N2980.
El encabezado del El sistema de archivos: The <filesystem> de la propuesta TR2 se ha agregado.Proporciona recursive_directory_iterator y otras características interesantes.Antes de que el trabajo en TR2 fuera inmovilizado porque C++0x ejecutaba muy tarde y modificando a C++11, ofrecen 2006 se deriva de Boost.Filesystem V2.Se desarrolló más adelante en Boost.Filesystem V3, pero no se implementa en Visual C++ en Visual Studio 2012.
¡Y una optimización importante!Todos los contenedores son óptimo pequeños ahora con sus representaciones actuales.Esto hace referencia a los objetos contenedores propios, no al señalar- a contenido.Por ejemplo, std::vector contiene tres punteros sin formato.En Visual C++ 2010, el modo de lanzamiento x86, std::vector fuera 16 bytes.En Visual C++ en Visual Studio 2012, es de 12 bytes, que es óptimo pequeño.Éste es un grande trato- si tiene 100.000 vectores del programa, Visual C++ en Visual Studio 2012 se guardará 400.000 bytes.El uso de memoria baja ahorra espacio y tiempo.
Esto se logra eludir el almacenamiento de asignadores vacíos y de comparadores, porque std::allocator y std::less no tienen estado.(Estas optimizaciones se habilitan para los asignadores personalizados o los comparadores también, mientras se estado.Naturalmente, el almacenamiento de asignadores con estado y de comparadores no se puede evitar, pero los son muy raros.)
Tamaños de contenedor
Las tablas siguientes muestran los tamaños de contenedor, en bytes, para x86 y plataformas x64.(ARM de 32 bits es equivalente a x86 para estos propósitos).Modo de lanzamiento de baraja de estas tablas, porque el modo de depuración contiene comprobar la maquinaria que utiliza el espacio y tiempo.Las columnas independientes son para Visual C++ 2008 SP1, donde _SECURE_SCL estableció como valor predeterminado a 1, y para Visual C++ 2008 SP1 con _SECURE_SCL establece manualmente en 0 para la velocidad máxima.Visual C++ 2010 y Visual C++ en Visual Studio 2012 tienen como valor predeterminado _SECURE_SCL a 0 (ahora conocido como _ITERATOR_DEBUG_LEVEL).
tamaños de contenedor x86 (bytes) |
V C9 SP1 |
V C9 SP1 SCL=0 |
V C10 |
V C11 |
---|---|---|---|---|
vector<int> |
24 |
16 |
16 |
12 |
matriz<int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
32 |
32 |
24 |
20 |
forward_list<int> |
N/D |
N/D |
8 |
4 |
lista<int> |
28 |
12 |
12 |
8 |
priority_queue<int> |
28 |
20 |
20 |
16 |
cola<int> |
32 |
32 |
24 |
20 |
pila<int> |
32 |
32 |
24 |
20 |
pares<int, int> |
8 |
8 |
8 |
8 |
tupla<int, int, int> |
16 |
16 |
16 |
12 |
mapa<int, int> |
32 |
12 |
16 |
8 |
multimap<int, int> |
32 |
12 |
16 |
8 |
establezca<int> |
32 |
12 |
16 |
8 |
conjunto múltiple<int> |
32 |
12 |
16 |
8 |
hash_map<int, int> |
72 |
44 |
44 |
32 |
hash_multimap<int, int> |
72 |
44 |
44 |
32 |
hash_set<int> |
72 |
44 |
44 |
32 |
hash_multiset<int> |
72 |
44 |
44 |
32 |
unordered_map<int, int> |
72 |
44 |
44 |
32 |
unordered_multimap<int, int> |
72 |
44 |
44 |
32 |
unordered_set<int> |
72 |
44 |
44 |
32 |
unordered_multiset<int> |
72 |
44 |
44 |
32 |
string |
28 |
28 |
28 |
24 |
el wstring |
28 |
28 |
28 |
24 |
tamaños de contenedor x64 (bytes) |
V C9 SP1 |
V C9 SP1 SCL=0 |
V C10 |
V C11 |
---|---|---|---|---|
vector<int> |
48 |
32 |
32 |
24 |
matriz<int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
64 |
64 |
48 |
40 |
forward_list<int> |
N/D |
N/D |
16 |
8 |
lista<int> |
56 |
24 |
24 |
16 |
priority_queue<int> |
56 |
40 |
40 |
32 |
cola<int> |
64 |
64 |
48 |
40 |
pila<int> |
64 |
64 |
48 |
40 |
pares<int, int> |
8 |
8 |
8 |
8 |
tupla<int, int, int> |
16 |
16 |
16 |
12 |
mapa<int, int> |
64 |
24 |
32 |
16 |
multimap<int, int> |
64 |
24 |
32 |
16 |
establezca<int> |
64 |
24 |
32 |
16 |
conjunto múltiple<int> |
64 |
24 |
32 |
16 |
hash_map<int, int> |
144 |
88 |
88 |
64 |
hash_multimap<int, int> |
144 |
88 |
88 |
64 |
hash_set<int> |
144 |
88 |
88 |
64 |
hash_multiset<int> |
144 |
88 |
88 |
64 |
unordered_map<int, int> |
144 |
88 |
88 |
64 |
unordered_multimap<int, int> |
144 |
88 |
88 |
64 |
unordered_set<int> |
144 |
88 |
88 |
64 |
unordered_multiset<int> |
144 |
88 |
88 |
64 |
string |
40 |
40 |
40 |
32 |
el wstring |
40 |
40 |
40 |
32 |
Guía de referencia rápida a números de versión de Visual C++
Visual C++ incluye diferentes “números de versión” dependiendo de dónde se fija.Existe la versión calificada (impresa en el cuadro), la versión interna (mostrado en el cuadro de diálogo Sobre ), y la versión del compilador (mostrada por cl.exe y la macro de _MSC_VER ).
Número de versión calificado |
Número de versión interno |
número de versión de #define _MSC_VER |
---|---|---|
Visual C++ 2005 |
V C8 |
1400 |
Visual C++ 2008 |
V C9 |
1500 |
Visual C++ 2010 |
V C10 |
1600 |
Visual C++ en Visual Studio 2012 |
V C11 |
1700 |
La macro de _MSC_VER es apropiada para las personas que desean a distintas versiones principales del destino de Visual C++ y emiten código diferente para ellos.
Vea también
Referencia
Instrucción for basada en intervalo (C++)
Otros recursos
Bienvenido a C++ (C++ moderno)