Fonctionnalités C++11 (C++ moderne)
Ce document décrit les fonctionnalités du nouveau C++ standard (également appelé C++11-that sont implémentés dans Visual C++.
Fonctionnalités du langage principal C++11
Visual C++ 2010 a implémenté de nombreuses fonctionnalités de la spécification du langage principal C++0x, à laquelle était le précurseur C++11, et Visual C++ dans Visual Studio 2012 se développe sur celui à inclure de nombreuses fonctionnalités C++11.Les fonctionnalités du langage principal des listes C++11 de tableau suivant et leur mode d'implémentation dans Visual C++ 2010 et Visual C++ dans Visual Studio 2012.
VC10 |
VC11 |
|
---|---|---|
v2.0 |
v2.1* |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Oui |
Oui |
|
v1.0 |
v1.0 |
|
Oui |
Oui |
|
v1.0 |
v1.1 |
|
v1.0 |
v1.1 ** |
|
Oui |
Oui |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Oui |
Oui |
|
Oui |
Oui |
|
Partial |
Oui |
|
Non |
Oui |
|
Non |
Non |
|
Non |
Non |
|
TR1 |
Partial |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Non |
Oui |
|
Non |
Non |
|
Oui |
Oui |
|
Non |
Non |
|
Non |
Non |
|
Non |
Non |
|
Oui |
Oui |
|
Non |
Oui |
|
Partial |
Oui |
|
Oui |
Oui |
|
Non |
Non |
Fonctionnalités du langage principal C++11 : Accès concurrentiel |
VC10 |
VC11 |
---|---|---|
N/A |
N/A |
|
Non |
Oui |
|
Non |
Oui |
|
Non |
Oui |
|
N/A |
N/A |
|
Non |
Oui |
|
le classement de données dépendance : annotation de fonction |
Non |
Non |
Oui |
Oui |
|
Non |
Non |
|
Non |
Non |
|
Partial |
Partial |
|
Non |
Non |
Fonctionnalités du langage principal C++11 : C99 |
VC10 |
VC11 |
---|---|---|
Partial |
Partial |
|
Partial |
Partial |
|
Oui |
Oui |
|
N/A |
N/A |
Voici un repère rapide des informations dans les tables.
Références Rvalue
N1610 « clarification de l'initialisation des objets de classe par des rvalues » une tentative a été précédemment pour activer la sémantique de déplacement sans références rvalue.Pour des raisons de cette discussion, appelons- « rvalue référence v0.1 ». Il a été remplacé par « des références v1.0rvalue. » « Référence v2.0Rvalue », qui est basé sur ce que le travail dans Visual C++ 2010 était, interdit les références rvalue de la liaison aux lvalues et de résoudre ainsi un problème de sécurité important. "Les références v2.1Rvalue « affine cette règle.Considérez vector<string>::push_back(), qui a des surcharges push_back(const string&) et push_back(string&&), et l'appel v.push_back("strval").L'expression "strval" est un littéral de chaîne, et c'est une l-value.(D'autres littéraux, par exemple l'entier 1729, sont des rvalues, mais les littéraux de chaîne sont spéciaux car ils sont des tableaux.) Les règles v2.0 des références rvalue ont indiqué, string&& ne peut pas se lier à "strval" car "strval" est une l-value, et par conséquent, push_back(const string&) est la seule surcharge viable.Cela créerait std::stringtemporaire, le copie dans le vecteur, puis détruit std::stringtemporaire.Ce n'est pas très efficace.Les règles des références v2.1 rvalue identifient la liaison string&& à "strval" créerait std::stringtemporaire, et que temporaire est une valeur rvalue.Par conséquent, push_back(const string&) et push_back(string&&) sont viables, et push_back(string&&) est préféré.std::string temporaire est construit, puis entré dans le vecteur.Il est plus efficace.
Les « références v3.0Rvalue » ajoute de nouvelles règles pour générer automatiquement des constructeurs de déplacement et de déplacer des opérateurs d'assignation sous certaines conditions.Toutefois, cela n'est pas implémenté dans Visual C++ dans Visual Studio 2012, en raison de les contraintes de temps et de ressources.
Attention |
---|
Les v0.1, v1.0, v2.0, v2.1, les désignations v3.0 sont inventés pour plus de clarté et afficher l'évolution de C++11. |
Lambdas
Après fonctions lambda ont été votés dans la feuille de travail (version 0,9) et de lambdas mutables ont été ajoutés (version 1,0), le Comité de normalisation a réémis les mots.Cela se produit des expressions version 1,1lambda.Ce produit trop tardive pour être incorporé dans Visual C++ 2010, mais il est dans Visual C++ dans Visual Studio 2012.Les mots de lambdas v1.1 clarifient ce qui se passe dans les cas faisants le coin aime référencer des membres statiques ou à des expressions lambda imbriqués.Cela résout les bogues qui sont déclenchés par des expressions lambda complexes.Supplémentaire dans Visual C++ dans Visual Studio 2012, les expressions lambda sans état sont convertibles aux pointeurs fonction.Ce n'est pas dans les mots N2927, mais il est compté dans le cadre de lambdas v1.1 de toute procédure.FDIS 5.1.2 [expr.prim.lambda/6] a cette description : « Le type de ferme pour une expression lambda sans la lambda- capture a une fonction non const explicite non virtuelle publique de conversion au pointeur vers une fonction ayant le même paramètre et types de retour que l'opérateur d'appel de fonction de le type de ferme.La valeur retournée par cette fonction de conversion sera l'adresse d'une fonction qui, lorsqu'elle est appelée, a le même effet que l'appelant l'opérateur d'appel de fonction de le type de la ferme. » ( Visual C++ dans Visual Studio 2012 est encore mieux que celui, car nous avons rendu des expressions lambda sans état convertibles aux pointeurs fonction qui ont les conventions d'appel arbitraires.Ceci est important lorsque vous utilisez les API qui attendent des éléments comme les pointeurs fonction d' __stdcall .)
decltype
Une fois le decltype a été interrogé dans la feuille de travail (version 1,0), il a reçu une petite mais une résolution de bogue à la dernière minute (version 1,1).Il s'agit de grand intérêt pour les programmeurs qui travaillent dans STL et à la push.
Fortement typé/faites suivre les enums déclarés
Enums fortement typés ont été partiellement pris en charge dans Visual C++ 2010 (en particulier, la partie sur les types sous-jacents spécifiés explicitement).Visual C++ dans Visual Studio 2012 les implémente pas, et implémente également entièrement la sémantique C++11 pour faites suivre les enums déclarés.
Alignement
Ni Visual C++ 2010 ni Visual C++ dans Visual Studio 2012 n'implémentent les principaux mots clés alignas/alignof de la langue proposition d'alignement qui a été interrogé dans la feuille de travail.Visual C++ 2010 avait aligned_storage de TR1.Visual C++ dans Visual Studio 2012 ajoute aligned_union et std::align() dans la bibliothèque standard.
Standard- disposition et triviaux types
Les modifications sont exposées dans « POD N2342 revisitée ; Résoudre la principale question 568 (version 5) » les ajouts d' is_trivial et d' is_standard_layout à <type_traits>.(N2342 a retouché les nombreux de les mots clés de langage, mais aucune modification de compilateur n'est nécessaire.) Ces le type caractéristiques était disponible dans Visual C++ 2010, mais il vient de se répéter is_pod.Par conséquent, le tableau précédemment dans ce document est désignée par « non » la prise en charge.Dans Visual C++ dans Visual Studio 2012, ils sont actionnés par les raccordements de compilateur qui sont conçus pour générer des réponses précises.
substitution et dernière
Cela est passé à une évolution courte mais complexe.Initialement, dans version 0,8, il existait [[override]], [[hiding]] et [[base_check]] des attributs.Puis dans version 0,9, les attributs ont été éliminés et remplacés par des mots clés contextuels.Enfin, dans version 1,0, ils ont été réduits à « final » sur les classes, et « override » et « final » sur les fonctions.Cela en fait une extension extensibilité car Visual C++ 2010 a déjà pris en charge cette syntaxe « override » sur les fonctions, et avait la sémantique raisonnablement près de celles dans C++11. "final » a également été pris en charge, mais sous l'orthographe différente « a » sealed.Dans Visual Studio 2012, l'orthographe et la sémantique standard « override » et « final » sont complètement prises en charge.Pour plus d'informations, consultez Spécificateur de substitution et Spécificateur final.
Les sciences atomiques, etc.
Les sciences atomiquesfort comparez et permutezfrontières de sécurité bidirectionnelles, et le classement de données dépendance spécifiez les ordinateurs standard de bibliothèque, qui sont implémentées dans Visual C++ dans Visual Studio 2012.
Fonctionnalités standard de bibliothèque
Ce décrit le langage principal.Comme pour la bibliothèque C++11 standard, nous n'avons pas un joli tableau des fonctionnalités, mais Visual C++ dans Visual Studio 2012 l'implémente, avec deux exceptions.D'abord, lorsqu'une fonctionnalité de bibliothèque dépend de la fonctionnalité qui est manquante dans le compilateur, il soit simulons ce qu'il exiger- pour l'exemple, nous simulent des modèles variadic pour make_shared<T>()(ou il n'implémentons il - pas y sommes uniquement certains cas, notamment, <initializer_list>.Ensuite, la bibliothèque C99 standard, qui est intégrée par référence à la bibliothèque C++11 standard, est principalement non implémentés, bien qu' <stdint.h> a été implémenté dans Visual C++ 2010.Voici une liste partielle des modifications dans Visual C++ dans Visual Studio 2012:
Les en-têtes :<atomic>, <chrono>, <condition_variable>, <future>, <mutex>, <ratio>, <scoped_allocator>, et <thread>.
Implémentation : selon les exigences de C++11, emplace()emplace_front()////emplace_back()emplace_hint()emplace_after() sont implémentés dans tous les conteneurs pour les nombres « arbitraires » d'arguments (consultez la section « variadics de false »).Par exemple, vector<T> a « template <typename... Args> void emplace_back(Args&&... args) » qui construit directement un élément avec du type T à l'arrière-plan du vecteur d'un nombre arbitraire d'arguments arbitraires, parfaitement transféré.Cela peut être plus efficace que push_back(T&&), qui comporterait une construction et la destruction supplémentaires de déplacement.
**Variadics de false :**Visual C++ dans Visual Studio 2012 d'une nouvelle modèle pour simuler les modèles variadic.Dans Visual C++ 2008 SP1 et Visual C++ 2010, les subheaders ont été répétée inclus avec des macros définies de façon différente à chaque fois, pour emboutir des surcharges pour 0, 1, 2, 3, arguments ou plus.Par exemple, <memory> a inclus le subheader interne <xxshared> à plusieurs reprises, pour emboutir make_shared<T>(args, args, args).Dans Visual C++ dans Visual Studio 2012, les subheaders sont allés.Maintenant les modèles variadic eux-mêmes sont définis comme macros (avec beaucoup de barre oblique inversée suites), puis développés à l'aide de clés macros.Cette modification interne d'implémentation a les effets :
Le code est plus facile, plus facile à utiliser (ajouter des subheaders était tout ce qu'il faut de travail), et plus lisible.
Il est plus difficile à entrer dans avec le débogueur- désolé !
Le constructeur d' pair(piecewise_construct_t, tuple<Args1...>, tuple<Args2...>) d' std::pair avait des effets intéressants « ».Cela nécessite les surcharges N^2 (si nous supportons jusqu'à 10 tuples, 121 signifie ces surcharges, car les tuples vides comptent ici, trop).
L'arrosage réseau forme de surcharges de paire- tuple, ainsi que toutes les surcharges d'implémentation, a consommé une masse de mémoire pendant la compilation.Par conséquent, nous avons réduit l'infini.Dans Visual C++ 2008 SP1 et Visual C++ 2010, l'infini était 10 (autrement dit, les modèles « variadic » a pris 0 à 10 arguments, inclus).Par défaut, l'infini est 5 dans Visual C++ dans Visual Studio 2012.Cela apporte la consommation de mémoire de compilateur à ce qu'il était dans Visual C++ 2010.Si vous avez besoin de plus d'arguments (par exemple, si vous avez le code existant qui utilise 6 tuples), il existe une issue de secours.Vous pouvez définir _VARIADIC_MAX projet large entre 5 et 10 inclus.Il utilise davantage de mémoire, et peut nécessiter que vous utilisez l'option du compilateur pour /Zm de réservation d'espace pour les en-têtes précompilés.
**Caractère aléatoire :**uniform_int_distribution est maintenant parfaitement impartial, et shuffle() est implémenté dans <algorithm>, qui accepte directement les générateurs de nombres aléatoires uniformes comme mersenne_twister.
Résistance les opérateurs d'adresse surchargés : C++98/03 est interdit un élément d'un conteneur STL de surcharger l'opérateur d'adresse.C'est ce que les classes comme CComPtr cas, afin que les classes d'assistance comme CAdapt ont été requises pour protéger la bibliothèque STL de ces surcharges.Pendant le développement d' Visual C++ 2010, STL change fait le pour interdire les opérateurs d'adresse surchargés dans beaucoup plus de situations.C++11 a modifié les spécifications de rendre les opérateurs d'adresse surchargés acceptables.C++11, et Visual C++ 2010, fournissent la fonction d'assistance std::addressof(), qui peut obtenir l'adresse vraie d'un objet indépendamment de la surcharge d'opérateur.Avant qu' Visual C++ 2010 a été libéré, nous avons essayé de remplacer les occurrences de « &elem » par « std::addressof(elem) », qui est correctement résistant.Dans Visual C++ dans Visual Studio 2012, nous avons allés davantage.Maintenant que nous avons audité tous les conteneurs et les itérateurs, afin que les classes qui surcharge l'opérateur address-of doivent être utilisables dans l'ensemble de la bibliothèque STL.
Visual C++ dans Visual Studio 2012 dépasse C++11 de plusieurs façons :
Itérateurs EFFRAYANTS : autorisée mais non requis par le C++11 standard, les itérateurs EFFRAYANTS ont été implémentés, comme décrit par N2911 « réduisant les dépendances dans les classes génériques pour les programmes plus rapides et plus petits » et « Assignation de l'itérateur N2980 et initialisation EFFRAYANTS, balisage 1 ".
Système de fichiers : l'en-tête d' <filesystem> de la proposition TR2 a été ajouté.Il offre recursive_directory_iterator et d'autres fonctionnalités intéressantes.Avant que le travail sur TR2 a été figé car C++0x exécutait très loin et changeait à C++11, la proposition 2006 a été dérivée de Boost.Filesystem V2.Ultérieurement s'est transformée en Boost.Filesystem V3, mais cela n'est pas implémenté dans Visual C++ dans Visual Studio 2012.
Et une optimisation essentielle !Tous nos conteneurs sont maintenant de façon optimale petits donnés leurs représentations actuelles.Cela fait référence aux objets conteneurs eux-mêmes, pas à leur pointer- au contenu.Par exemple, std::vector contient trois bruts pointeurs.Dans Visual C++ 2010, le mode de version finale x86, std::vector est de 16 octets.Dans Visual C++ dans Visual Studio 2012, il est de 12 octets, qui est de façon optimale petit.Il s'agit d'un grand affaire- si vous avez 100.000 vecteurs dans votre programme, vous Visual C++ dans Visual Studio 2012 enregistrera 400.000 octets.L'utilisation de la mémoire diminuée ménage les deux du temps et espace.
Cela a été accompli en évitant la mémoire les allocateurs vides et des comparateurs, car std::allocator et std::less sont sans état.(Ces optimisations sont activées pour les allocateurs personnalisés/comparateurs aussi, tant qu'elles sont sans état.Évidemment, la mémoire les allocateurs avec état/des comparateurs ne peut pas être évitée, mais ceux qui sont très rares.)
Tailles de conteneur
Les tableaux suivants présentent les tailles de conteneur, en octets, pour x86 et x64 les plateformes.(ARM de 32 bits est équivalent au x86 à ces fins).Mode de version finale de couverture de ces tables, car le mode débogage contient contrôler les ordinateurs qui utilisent le temps et espace.Les colonnes séparées sont pour Visual C++ 2008 SP1, où _SECURE_SCL avait la valeur par défaut à 1, et pour Visual C++ 2008 SP1 avec _SECURE_SCL définissez manuellement à 0 pour la rapidité maximale.Visual C++ 2010 et Visual C++ dans Visual Studio 2012 ont comme valeur par défaut _SECURE_SCL à 0 (maintenant appelé _ITERATOR_DEBUG_LEVEL).
tailles de conteneur x86 (octets) |
VC9 SP1 |
VC9 SP1 SCL=0 |
VC10 |
VC11 |
---|---|---|---|---|
<int>vectoriels |
24 |
16 |
16 |
12 |
tableau<int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
32 |
32 |
24 |
20 |
forward_list<int> |
N/A |
N/A |
8 |
4 |
liste<int> |
28 |
12 |
12 |
8 |
priority_queue<int> |
28 |
20 |
20 |
16 |
file d'attente<int> |
32 |
32 |
24 |
20 |
pile<int> |
32 |
32 |
24 |
20 |
paires<int, int> |
8 |
8 |
8 |
8 |
tuple<int, int, int> |
16 |
16 |
16 |
12 |
mappage<int, int> |
32 |
12 |
16 |
8 |
mappage de plusieurs<int, int> |
32 |
12 |
16 |
8 |
définissez<int> |
32 |
12 |
16 |
8 |
multiensemble<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 |
wstring |
28 |
28 |
28 |
24 |
taille du conteneur x64 (octets) |
VC9 SP1 |
VC9 SP1 SCL=0 |
VC10 |
VC11 |
---|---|---|---|---|
<int>vectoriels |
48 |
32 |
32 |
24 |
tableau<int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
64 |
64 |
48 |
40 |
forward_list<int> |
N/A |
N/A |
16 |
8 |
liste<int> |
56 |
24 |
24 |
16 |
priority_queue<int> |
56 |
40 |
40 |
32 |
file d'attente<int> |
64 |
64 |
48 |
40 |
pile<int> |
64 |
64 |
48 |
40 |
paires<int, int> |
8 |
8 |
8 |
8 |
tuple<int, int, int> |
16 |
16 |
16 |
12 |
mappage<int, int> |
64 |
24 |
32 |
16 |
mappage de plusieurs<int, int> |
64 |
24 |
32 |
16 |
définissez<int> |
64 |
24 |
32 |
16 |
multiensemble<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 |
wstring |
40 |
40 |
40 |
32 |
Guide de référence rapide des numéros de version de Visual C++
Visual C++ a des « numéros de version » selon que vous recherchez.Il existe une version marquée (imprimée sur la zone), la version interne (affichée dans la boîte de dialogue Sur de ), et la version de compilateur (affichée par cl.exe et le d' _MSC_VER ).
Numéro de version signalé |
Numéro de version interne |
numéro de version d'#define _MSC_VER |
---|---|---|
Visual C++ 2005 |
VC8 |
1400 |
Visual C++ 2008 |
VC9 |
1500 |
Visual C++ 2010 |
VC10 |
1600 |
Visual C++ dans Visual Studio 2012 |
VC11 |
1700 |
Le d' _MSC_VER est intéressante aux personnes qui souhaitent cibler des versions principales d' Visual C++ et émettre du code différent pour elles.
Voir aussi
Référence
Basé sur une plage, instruction (C++)
Autres ressources
Accueil vers C++ (C++ moderne)
Guide de référence du langage C++