
Compilateur
Cette version apporte de nombreux correctifs et améliorations au compilateur MSVC et à la bibliothèque standard.
Visual Studio 2022 17.14 prend en charge de plusieurs fonctionnalités de C++23, qui sont disponibles sous les drapeaux /std:c++latest et /std:c++23preview.
Vous pouvez maintenant omettre les () dans certaines formes de lambdas qui les nécessitaient auparavant.
Code : | Sélectionner tout |
auto lambda = [] constexpr { }; //no '()' needed after the capture list
if consteval a été imlémenté, avec lequel vous pouvez exécuter un code différent selon que l'instruction est exécutée à la compilation ou à l'exécution. Ceci est utile dans les cas où votre version d'exécution peut être fortement optimisée avec des intrinsèques du compilateur ou de l'assemblage en ligne qui ne sont pas disponibles au moment de la compilation :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | constexpr size_t strlen(char const* s) { if consteval { // if executed at compile time, use a constexpr-friendly algorithm for (const char *p = s; ; ++p) { if (*p == '\0') { return static_cast<std::size_t>(p - s); } } } else { // if executed at run time, use inline assembly __asm__("SSE 4.2 magic"); } } |
Cette version prend désormais en charge les attributs pour les lambdas :
Code : | Sélectionner tout |
1 2 3 4 5 | auto lambda = [] [[nodiscard]] [[deprecated]] { return 10; }; void f() { lambda(); // fires a deprecation warning and a discard of return value warning. } |
Elle prend également en charge static operator() et static operator[]. Ceux-ci permettent au compilateur de générer un code plus efficace pour ces opérateurs lorsque le paramètre objet implicite n'est pas nécessaire et ne doit donc pas être transmis comme argument à la fonction :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | struct X { static bool operator()(int) const; }; inline constexpr X x; int count_x(std::vector<int> const& xs) { return std::count_if(xs.begin(), xs.end(), x); } |
La performance du code généré s'est améliorée grâce à la 17.14 qui inclut des optimisations SSA antérieures et des simplifications du flux de contrôle. Le compilateur 17.14 génère un code 20 % plus rapide que la version initiale de Visual Studio 2022 17.
Pour le débit, le compilateur 17.14 incorpore une simplification du flux de données qui a réduit le temps de compilation d'un lien UnrealEngine /LTCG repro de 13%.
Bibliothèque standard
Les développeurs de Visual Studio ont implémenté des parties du durcissement de la bibliothèque standard, qui vérifie certaines instances de comportement non défini au moment de l'exécution et les signale à l'utilisateur. Ceci est actuellement désactivé par défaut, mais vous pouvez l'activer en définissant _MSVC_STL_HARDENING à 1 pour l'ensemble du projet. La proposition utilise les violations de contrat C++26 comme mécanisme pour signaler les violations de préconditions durcies, mais comme ils n'ont pas encore implémenté les contrats, ils l'ont appelé par défaut __fastfail().
Une autre nouvelle fonctionnalité de sécurité ajoutée est la pierre tombale du destructeur, qui aide à atténuer les erreurs de type « use-after-free ». Ceci est également désactivé par défaut, mais peut être activé en définissant _MSVC_STL_DESTRUCTOR_TOMBSTONES à 1 pour l'ensemble du projet.
Voici quelques améliorations diverses apportées :
- Support du compilateur pour static operator(), ce qui améliore légèrement le codegen.
- Ils ont marqué std::expected, std::unexpected, et tous les types d'exception STL comme [[nodiscard]]. Cela vous aidera à éviter de les utiliser à mauvais escient.
- Amélioration des visualiseurs pour std::basic_string_view et ses itérateurs.
- Ajout ou amélioration des implémentations vectorielles de std::basic_string::find(), find_first_of(), et find_last_of().
Débogage dynamique C++
Le débogage dynamique C++ est une nouvelle fonctionnalité du compilateur et de l'EDI qui vous donne les performances des versions optimisées avec l'expérience de débogage des versions non optimisées. Elle est désormais disponible en avant-première exclusivement avec l'ensemble d'outils MSVC et fonctionne en désoptimisant dynamiquement les fonctions sur lesquelles vous placez des points d'arrêt désoptimisés ou dans lesquelles vous entrez.
Par exemple, sans débogage dynamique C++, vous pourriez voir ceci dans votre fenêtre Watch :
De nombreuses variables ne sont pas disponibles, de sorte que le débogueur ne peut pas les visualiser.
Cependant, lorsque vous activez la fonctionnalité, vous pouvez voir ceci :
Les valeurs des variables sont maintenant disponibles car la fonction a été désoptimisée dynamiquement.
Pour commencer, passez votre configuration en mode Release. Ensuite, faites un clic droit sur votre projet et cliquez sur Propriétés pour ouvrir le menu Propriétés de configuration. Dans ce menu, cliquez sur Advanced > Use C++ Dynamic Debugging > Yes. Enfin, reconstruisez votre projet. La définition de cette propriété désactivera l'optimisation de l'ensemble du programme.
EDI
Vous pouvez maintenant remplir automatiquement les arguments du modèle dans la barre de modèle, qui affiche et permet d'éditer les paramètres du modèle, lorsque vous utilisez Go to Definition ou F12.
Par exemple, en appuyant sur F12 sur un vecteur, vous passerez au vecteur avec la barre de modèle automatiquement remplie, ce qui vous permettra d'inspecter et de modifier rapidement les paramètres du modèle.
Dans l'exemple ci-dessous, l'utilisation de la fonction Go to Definition ou l'appui sur la touche F12 remplit à la fois le type et l'allocateur dans la barre de gabarit.
Ils ont également ajouté la possibilité de contrôler les en-têtes qui apparaissent dans la liste d'inclusion lorsque vous tapez #include.
Le paramètre déroulant dans Tools → Options → Text Editor → C/C++ → IntelliSense → Include style for suggestions pour les suggestions affecte maintenant à la fois les suggestions d'inclusion et la complétion d'inclusion, avec les comportements affinés suivants :
- Directives de base (par défaut) : Utilise des guillemets pour les chemins relatifs et des crochets pour tout le reste.
- Mode guillemets : Utilise les guillemets pour tous les en-têtes sauf les en-têtes standard, qui utilisent les crochets.
- Mode crochets : Utilise des crochets pour tous les en-têtes qui font partie du chemin d'inclusion.
CMake
Cette version ajoute la prise en charge des compléments IntelliSense et des informations rapides pour les modules CMake dans Visual Studio. Désormais, vous pouvez voir tous les modules CMake disponibles et en savoir plus sur eux directement à partir de l'éditeur Visual Studio.
Lorsque vous survolez un module CMake référencé, IntelliSense fournit des informations détaillées sur le module sélectionné, ce qui vous permet de comprendre son utilisation et ses fonctionnalités en un coup d'œil.
Lorsque vous commencez à taper un module CMake dans votre fichier CMakeLists.txt ou dans d'autres fichiers de script CMake, IntelliSense fournit une liste de...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.