Share via


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.

Fonctionnalités du langage principal C++11

VC10

VC11

Références v0.1Rvalue v1.0v2.0v2.1, v3.0

v2.0

v2.1*

références qualificateurs

Non

Non

Initialiseurs de membre non static

Non

Non

Modèles v0.9de Variadic, v1.0

Non

Non

Listes d'initialiseurs

Non

Non

static_assert

Oui

Oui

auto v0.9, v1.0

v1.0

v1.0

Types de retour de fin

Oui

Oui

Lambdas v0.9v1.0, v1.1

v1.0

v1.1

decltype v1.0, v1.1

v1.0

v1.1 **

Signe " supérieur à "

Oui

Oui

Arguments template par défaut pour les modèles de fonctions

Non

Non

Expression SFINAE

Non

Non

Alias modèles

Non

Non

Modèles extern

Oui

Oui

nullptr

Oui

Oui

Enums fortement typés

Partial

Oui

Forward a déclaré les enums

Non

Oui

Attributs

Non

Non

constexpr

Non

Non

Alignement

TR1

Partial

Déléguer des constructeurs

Non

Non

Hériter des constructeurs

Non

Non

Opérateurs de conversion explicite

Non

Non

char16_t

Non

Non

Littéraux de chaîne Unicode

Non

Non

Littéraux de chaîne bruts

Non

Non

Nom de caractère universel dans les littéraux

Non

Non

Littéraux définis par l'utilisateur

Non

Non

Standard- disposition et triviaux types

Non

Oui

Fonctions eues par défaut et supprimées

Non

Non

Déclarations friend étendues

Oui

Oui

Étendu

Non

Non

Les espaces de noms intégrés

Non

Non

Unions virtuels

Non

Non

Types locaux ou sans nom en tant qu'arguments template

Oui

Oui

La boucle basé sur une plage

Non

Oui

substitution et finaux v0.8v0.9, v1.0

Partial

Oui

Prise en charge minimale GC

Oui

Oui

noexcept

Non

Non

Fonctionnalités du langage principal C++11 : Accès concurrentiel

VC10

VC11

Points de séquence reformulés

N/A

N/A

Les sciences atomiques

Non

Oui

Fort comparez et permutez

Non

Oui

Frontières de sécurité bidirectionnelles

Non

Oui

Modèle de mémoire

N/A

N/A

le classement de données dépendance

Non

Oui

le classement de données dépendance : annotation de fonction

Non

Non

exception_ptr

Oui

Oui

quick_exit

Non

Non

Les sciences atomiques dans les gestionnaires de signal

Non

Non

Stockage local des threads

Partial

Partial

Statique magique

Non

Non

Fonctionnalités du langage principal C++11 : C99

VC10

VC11

__func

Partial

Partial

Préprocesseur C99

Partial

Partial

pendant longtemps

Oui

Oui

Types d'entiers étendus

N/A

N/A

Voici un repère rapide des informations dans les tables.

Hh567368.collapse_all(fr-fr,VS.110).gifRé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.

Mise en gardeAttention

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.

Hh567368.collapse_all(fr-fr,VS.110).gifLambdas

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 .)

Hh567368.collapse_all(fr-fr,VS.110).gifdecltype

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.

Hh567368.collapse_all(fr-fr,VS.110).gifFortement 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.

Hh567368.collapse_all(fr-fr,VS.110).gifAlignement

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.

Hh567368.collapse_all(fr-fr,VS.110).gifStandard- 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.

Hh567368.collapse_all(fr-fr,VS.110).gifsubstitution 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.

Hh567368.collapse_all(fr-fr,VS.110).gifLes 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.

Hh567368.collapse_all(fr-fr,VS.110).gifFonctionnalité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.)

Hh567368.collapse_all(fr-fr,VS.110).gifTailles 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

Expressions lambda en C++

Basé sur une plage, instruction (C++)

Autres ressources

Accueil vers C++ (C++ moderne)

Guide de référence du langage C++

Référence de la bibliothèque C++ standard

Blog de l'équipe Visual C++