C ++ moderne! = (Le plus) nouveau standard



Le terme «C ++ moderne» est souvent utilisé comme synonyme de l'expression «code utilisant le nouveau standard C ++». Ici, «nouveau» peut signifier n'importe quoi de C ++ 11 à C ++ 17, ou même ce qui est déjà disponible à partir de C ++ 20. Je pense que le C ++ moderne est quelque chose de plus, non limité à l'ajout du drapeau -std = c ++ 17 .

Que signifie moderne?


Si nous recherchons le sens du mot «moderne» sur le net, l'un des premiers nous trouvera une définition du dictionnaire Merriam-Webster . Voici deux parties liées au C ++:

[...]

2: impliquant des techniques, méthodes ou idées récentes: méthodes de communication modernes (à jour)

3 majuscules: de, se rapportant à, ou ayant les caractéristiques de la période actuelle ou la plus récente de développement d'une langue - l'anglais moderne

[...]

Les techniques, les méthodes et les idées ne se limitent pas aux nouvelles fonctionnalités du langage. Souvent, ces nouvelles fonctionnalités prennent en charge ou incluent de nouvelles techniques, mais beaucoup d'entre elles existent depuis un certain temps. Quant aux caractéristiques du développement du langage, elles sont basées sur la façon dont nous utilisons le langage. Cela fait référence à la façon dont nous combinons les anciennes et les nouvelles fonctionnalités, et c'est plus qu'un simple programme C ++ fonctionnel, ou quelque chose qui est inclus dans la bibliothèque standard.

On peut affirmer que les capacités qui existent depuis C ++ 98 ne font pas partie du C ++ moderne, car elles existent depuis trop longtemps. Cependant, il faut se rappeler que les personnes les plus actives de la communauté qui parlent ou écrivent sur le «C ++ moderne» sont le plus souvent des pionnières. La plupart utilisent, étudient et enseignent même le bon vieux «C avec des classes» des années 90, ce qui fait que la plupart des méthodes qui n'y sont pas utilisées font partie du C ++ moderne.

Au-delà des nouvelles fonctionnalités


Lequel des éléments disponibles en C ++ 98 est-ce que je considère appartenir à la catégorie des «C ++ modernes»? Voici une liste partielle de quelques fonctionnalités et idées importantes:

RAII


RAII signifie «obtenir une ressource est l'initialisation» ou «obtenir une responsabilité est l'initialisation». Bien que le nom se concentre sur «l'initialisation», l'élément clé ici est en fait le destructeur. La libération déterministe des ressources est l'une des principales caractéristiques du C ++ qui le distingue de la plupart des autres langages. Pour beaucoup, c'est la caractéristique la plus importante .

RAII peut être utilisé pour gérer de manière fiable de nombreux éléments, tels que la mémoire (par exemple, std :: vector, std :: string ), les descripteurs de fichiers ( std :: fstream ), les connexions réseau, les mutex, les connexions de base de données, ainsi que les entités qui sont étroitement liés aux ressources. Si vous avez besoin d'un moyen fiable pour effectuer une action, puis l'annulez lorsque vous quittez une certaine portée ou lorsque vous détruisez un objet, RAII est ce dont vous avez besoin.

J'ai vu beaucoup de code dans lequel le nettoyage manuel à la fin des fonctions s'est transformé en cauchemar. Dans le cas d'exceptions, un tel nettoyage ne se produit pas, donc dans cette situation, RAII est ce dont vous avez besoin . Même si vous n'utilisez pas d'exceptions, une sortie anticipée des fonctions peut améliorer considérablement votre code, mais uniquement si vous n'avez pas besoin de le nettoyer.

La technique RAII fait définitivement partie du C ++ moderne, bien qu'elle soit disponible depuis le début.

Typage fort


L'idée d' un typage fort a été très populaire ces derniers temps. Dans le passé, tous les identifiants, tailles, codes postaux, prix, etc. étaient représentés via int ou double, ou un autre type arithmétique. Le fait qu'elles soient compatibles, totalement indépendantes les unes des autres, qui par pur hasard sont du même type, a été une source de bugs, mais que puis-je faire? Au moins, le compilateur ne convertit pas silencieusement les nombres et les tableaux en chaînes !

En fait, il s'avère que le système de type C ++ et les abstractions zéro coût * que le compilateur nous fournit peuvent faire beaucoup. Créez simplement différents types d'identifiants, de codes postaux, de tailles (non, pas de typedef, merci) et ainsi de suite. Si vous êtes intéressé, consultez l'une des conférences de Björn Fahller , Jonathan Boccara ou Jonathan Müller .

* (Même si le coût de l'abstraction est non nul, prouver qu'il est inacceptable avant de l'abandonner)

Mis à part quelques ajouts récents, <algorithme> a été dans la bibliothèque standard depuis le début. Mais si vous regardez le code, il s'avère que les gens préfèrent souvent écrire des boucles manuellement. Les raisons vont de ne pas savoir quels algorithmes standard sont disponibles à croire que «les modèles sont trop lents» (souvent sans explication, par rapport à quoi).

Programmation de la phase de compilation


Des choses comme la métaprogrammation à l'aide de modèles sont utilisées depuis C ++ 98. La logique exécutée au moment de la compilation peut réduire considérablement la complexité au moment de l'exécution. Dans le passé, il n'était pas pratique à utiliser. La syntaxe des modèles diffère dans le sens de la complexité des capacités des dernières normes. C'est quelque chose comme une langue distincte que nous devons apprendre. Cependant, des choses comme la répartition des balises ou les traits ne sont pas trop compliquées à utiliser et à écrire.

Oui, la plupart des traits de la bibliothèque standard sont apparus avec l'avènement de C ++ 11, mais les écrire selon vos besoins n'est pas trop difficile, et certains des plus courants étaient dans Boost avant C ++ 11. Je considère que l'utilisation de la logique de l'étape de compilation fait partie du C ++ moderne car elle sépare le C ++ du «C avec classes» omniprésent.

Conclusion


Le C ++ moderne n'est pas lié aux nouvelles normes, mais à la façon dont nous écrivons nos programmes. Tout d'abord, C ++ 98 peut être écrit dans un style plus ou moins moderne. Deuxièmement, «C avec des classes et basé sur une plage pour les boucles» n'est pas encore un C ++ moderne. Les nouvelles fonctionnalités du langage et des bibliothèques nous aident à écrire dans le style du C ++ moderne, mais elles ne rendent pas notre code C ++ moderne.

Source: https://habr.com/ru/post/fr429780/


All Articles