Ce que vous devez savoir sur le C ++ 11 - Partie III


Voir: Partie 1 et Partie 2 Série

Ce sera la troisième et dernière partie de cette brève introduction à C ++ 11 caractéristiques. Jusqu'ici, nous avons pris un regard sur les différentes caractéristiques de la langue intéressante. Maintenant, nous pouvons voir ce qui se passe avec le Standard Library (STD). Comme vous le verrez non seulement la langue se améliore, mais le MST ainsi!

Ce temps:




  • soutien aux discussions
  • gestion de la mémoire avec des pointeurs intelligents

Aussi, nous allons essayer de prédire l'avenir de la langue et je vais décrire ce que nous avons manqué pendant ce voyage.

Nuancier

Le code source peut être trouvé sur mon Github: fenbf/cpp11samples

Nous créons un fil!

Lancer 20 threads parallèles ...

const num_threads int = 20; fil myThreads [num_threads]; for (int i = 0; i Ce qui est surprenant le code exemple ci-dessus?

Le fait est que tout cela est arrivé sans aucune troisième bibliothèque de partie spéciale. Toutes les classes de fil et les services publics sont en std ::. dans l'ancienne norme il n'y avait pas une telle option.

Nous avons d'abord créé une série de std :: fil, puis nous créons ces fils dans la boucle for (lignes 5-12). La chose intéressante est que je suis sur mes fils et utiliser des expressions lambda pour le code «vocation».

Après que tous les fils sont démarrés nous devons attendre pour eux. Cela se fait via join () méthode. Fondamentalement, le thread principal attend toutes les discussions pour terminer leur travail.

Sur la droite est un débogueur de l'écran.

  1. La première flèche indique le code à l'exécution
  2. Les deuxième et troisième flèches indiquent toutes les discussions actives (en débogage - fils fenêtre). Vous pouvez voir qu'il ya un fil commun et thread de travail (qui gère le std :: cout)

Plus: contrats à terme et asynchrone

Nous pouvons faire encore mieux! C ++ 11 a tous les objets pour enfiler fils que (bien sûr), des verrous, des variables de condition, aussi Atomics. Mais il ya aussi une API de niveau supérieur qui peut faire ce qui suit:

Double perform_long_computation () { // Un algorithme sophistiqué ... retour 10; } futureTest annuler () { résultat = std :: voiture asynchrone ([] () { retour perform_long_computation (); }); Double finalResult result.get = (); }

Ce est un peu 'exemple plus complexe (bien qu'il semble très simple). Comme mentionné précédemment, Standard Library introduit une API de niveau supérieur qui donne les caractéristiques d'appeler des fonctions asynchrone. Fondamentalement, vous utilisez std :: asynchrone pour appeler la fonction (dans notre exemple, nous avons utilisé lambda + fonctionnement normal). Ensuite, vous obtenez un gestionnaire d'objet (la variable "résultat") qui contient l'état interne de l'exécution asynchrone. Lorsque vous appelez .get () toute la magie qui se passe sous les MST et garantit que le résultat sera disponible.

Un autre regard:

  • résultat est un objet spatial qui contient la soi-disant état partagé.
  • .get () fonction assure le résultat est calculé - vous pouvez commencer la discussion et d'attendre jusqu'à ce qu'il se termine.

Vous pouvez en savoir plus sur l'avenir de mon blog ou cpp-11-async-tutorial /

La gestion de la mémoire avec des pointeurs

Quel est le problème avec ce code?

badPointers vides () { * Voitures Car = new voiture («mon»); some_condition bool = true; if (some_condition) reviens; éliminer voiture; }

Nous avons créé une voiture de l'objet sur la pile (boutique hors) et puis finalement appelé anéantir; Mais ce qui se passera lorsque la variable some_condition il? Nous aurons une fuite de mémoire!

Ce code est très simple, mais se il vous plaît imaginer une centaine de lignes de code. Il ne est pas facile à retenir pour effacer la mémoire dans la bonne position. Peut-être il ya quelques méthodes qui pourraient nous aider?

betterPointers vides () { std :: voiture unique_ptr (nouvelle voiture ("mon")); some_condition bool = true; if (some_condition) reviens; }

Pointeurs

Type de pointeur Description unique_ptr ne peuvent être copiées, mobile shared_ptr peut être partagée et copié, compteur de référence à l'intérieur weak_ptr non-exclusive, pour briser les cycles, peuvent être convertis en shared_ptr Pointeur brut seulement d'observer

Comme vous pouvez le voir, nous avons utilisé une chose appelée unique_ptr de la bibliothèque standard. Nous pouvons maintenant retirer toutes les expressions de l'élimination. En général, unique_ptr est une implémentation d'un pointeur idée intelligente.

En bref: un pointeur intelligent a propriété un pointeur et est responsable de la détruire. Dans notre exemple, lorsque la voiture est hors de portée de son pointeur sera supprimé. Notez que nous pouvons laisser le champ en deux points: lorsque la fonction «naturellement» se termine ou lorsque some_condition est vrai (puis quitter également la portée). Dans ces deux États unique_ptr se chargera de nettoyage de la mémoire.

En C ++ moderne vous ne devriez pas utiliser des pointeurs premières à tout. Dans la plupart des cas, pointeurs intelligents seront mieux et nous économiser beaucoup de problèmes. Pointeurs premières sont ok, mais seulement pour l'observation des objets.

Voir un tableau sur la droite pour plus de référence sur les pointeurs intelligents.

L'avenir est prometteur

C ++ 11, comme son nom l'indique, a été standardisée en 2011. Mais, heureusement, nous ne avons pas besoin d'attendre encore 10 ans ou plus pour un autre grand pas! Cette année - en 2014 - une autre norme testament (ou fait est) accepté: C ++ 14 ce est une mise à jour mineure C ++ 11.

C ++ 14 ajoute quelques améliorations à la langue comme lambda meilleure, meilleure déduction pour les types de retour d'une fonction, touples améliorées ... Tous les changements peuvent être trouvés ici dans la page wiki.

La chose la plus importante est de savoir ce comité de normalisation se développe une nouvelle norme C ++ 17 qui apportera encore plus de mises à jour. La langue est en grande forme, mais malheureusement, il ya beaucoup de choses à faire avec la bibliothèque standard. Par exemple, lorsqu'ils sont confrontés à .NET Framework SDK Java ou il ya une grande différence contre C ++. Bien sûr, il ya de grandes bibliothèques pour C ++ (comme Boost), mais toujours il serait agréable d'avoir puissante bibliothèque standard installé avec le compilateur.

C ++ 17 va apporter beaucoup de nouvelles bibliothèques: système de fichiers, réseau, une meilleure concurrence, peut-être même dessin en 2D!

Quelles sont les caractéristiques ont été ignorés

La liste complète des changements linguistiques et la bibliothèque dispose d'environ 45 articles. Un grand nombre de fonctionnalités ne ont pas été mentionné dans la série. Ci-dessous vous trouverez une liste des sujets qui doivent être révisées et creuser ainsi.

  • références rvalue et déplacer la sémantique
  • récipients non ordonnées
  • Support d'expression régulière
  • modèles variadique
  • une expression constante (de constexpr)
  • littéraux définis par l'utilisateur
  • et bien plus encore ...

Voir la liste complète ici une grande page wiki.

Conclusion

La troisième partie, la dernière, ce est fini. Je espère que vous avez au moins une introduction générale aux caractéristiques linguistiques et impressionnante bibliothèque en C ++ 11. Je vous encourage à creuser et de lire plus sur le C ++ moderne.

Que pensez-vous de la série? Je ai peut-être manqué quelque chose d'important? peut-être un argument pourrait être décrit? Se il vous plaît partagez vos opinions.

Voir: Partie 1 et Partie 2 Série

Ressources et liens

  • @ Drdobbs.com c ++ 11s modèle asynchrone - tutoriel sur std :: asynchrone et du fil
  • http://isocpp.org/ - site officiel cpp

Vous pouvez également en savoir plus sur C ++ 11 au blog de Bartek: www.bfilipek.com

La plupart des icônes et des images proviennent d'un excellent site: openclipart.org

(0)
(0)
Article précédent Poissons intermédiaire mer
Article suivant Mycose Définition

Commentaires - 0

Sans commentaires

Ajouter un commentaire

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Caractères restants: 3000
captcha