Pour STL ou! STL, c’est la question

Indiscutablement, je choisirais d’utiliser la STL pour la plupart des projets de programmation C ++. La question m’a été cependant présentée récemment: “Y a-t-il des cas où vous n’utiliseriez pas le TSL?”

Plus j’y pensais, plus je me rendais compte que peut-être il y aurait des cas où je choisirais de ne pas utiliser la STL … Par exemple, un projet vraiment long et à long terme dont le code devrait durer des années … Une solution de conteneur personnalisée qui correspond exactement aux besoins du projet vaut la charge initiale? Que pensez-vous, y a-t-il des cas où vous choisiriez de ne pas utiliser STL?

Les projets avec des exigences ssortingctes en matière de mémoire, par exemple pour les systèmes intégrés, peuvent ne pas convenir à la STL, car il peut être difficile de contrôler et de gérer ce qui est pris et renvoyé au tas. Comme Evan l’a mentionné, écrire des allocateurs appropriés peut aider, mais si vous comptez chaque octet utilisé ou concerné par la fragmentation de la mémoire, il peut être plus judicieux de déployer une solution adaptée à votre problème spécifique, la STL ayant été optimisée. pour l’usage le plus général.

Vous pouvez également choisir de ne pas utiliser STL pour un cas particulier, car il existe davantage de conteneurs applicables qui ne figurent pas dans la norme actuelle, tels que boost :: array ou boost :: unordered_map.

Les principales raisons de ne pas utiliser STL sont les suivantes:

  1. Votre implémentation C ++ est ancienne et prend en charge un modèle horrible.
  2. Vous ne pouvez pas utiliser l’allocation de mémoire dynamic.

Les deux sont des exigences très rares dans la pratique.

Pour un projet à long terme, déployer vos propres conteneurs qui se chevauchent avec la STL ne fera qu’augmenter les coûts de maintenance et de développement.

Il y a tellement d’avantages à utiliser le stl. Pour un projet à long terme, les avantages l’emportent sur les coûts.

  1. Les nouveaux programmeurs peuvent comprendre les conteneurs dès le premier jour, ce qui leur donne plus de temps pour apprendre l’autre code du projet. (en supposant qu’ils connaissent déjà STL comme n’importe quel programmeur C ++ compétent)
  2. Corriger les bogues dans les conteneurs pèse et gaspille du temps qui pourrait être consacré à l’amélioration de la logique métier.
  3. Très probablement, vous n’allez pas les écrire aussi bien que la STL est implémentée de toute façon.

Cela étant dit, les conteneurs STL ne traitent pas du tout la concurrence. Donc, dans un environnement où vous avez besoin de simultanéité, j’utiliserais d’autres conteneurs tels que les conteneurs concurrents Intel TBB. Celles-ci sont bien plus avancées en utilisant un locking précis, de sorte que différents threads peuvent modifier le conteneur simultanément et que vous ne devez pas sérialiser l’access au conteneur.

Habituellement, je trouve que le meilleur pari est d’utiliser la STL avec des allocateurs personnalisés au lieu de remplacer les conteneurs STL par des rouleaux roulés à la main. La bonne chose à propos de la STL est que vous ne payez que pour ce que vous utilisez.

Je pense que c’est un scénario typique de build vs buy. Cependant, je pense que dans ce cas, je «achèterais» presque toujours, et utiliserais STL – ou une meilleure solution (quelque chose de Boost peut-être), avant de lancer le mien. Vous devriez concentrer vos efforts sur ce que fait votre application, et non sur les blocs de construction utilisés.

Je ne le pense pas vraiment. En créant mes propres conteneurs, j’essayerais même de les rendre compatibles avec la STL car la puissance des algorithmes génériques est trop grande pour être abandonnée. La STL devrait au moins être utilisée nominalement, même si vous ne faites qu’écrire votre propre conteneur et spécialiser chaque algorithme. De cette façon, chaque algorithme de sorting peut être appelé par sorting (c.begin (), c.end ()). Si vous vous spécialisez, faites le même effet, même si cela fonctionne différemment.

Codage pour Symbian.

STLPort supporte Symbian 9, donc le cas de l’utilisation de STL est plus faible qu’il ne l’était (“ce n’est pas disponible” est un cas assez convaincant), mais la STL est toujours étrangère à toutes les bibliothèques Symbian. faire les choses à la manière Symbian.

Bien sûr, on pourrait faire valoir que le codage pour Symbian n’est pas un “projet de programmation C ++”.

La plupart des projets sur lesquels j’ai travaillé avaient une base de code bien plus ancienne que toute version réellement utilisable de STL – nous avons donc choisi de ne pas l’introduire maintenant.

Une situation dans laquelle cela peut se produire est lorsque vous utilisez déjà une bibliothèque externe qui fournit déjà les capacités dont vous avez besoin de la part de la STL. Par exemple, mon entreprise développe une application dans des zones à espace limité et utilise déjà Qt pour la boîte à outils de fenêtrage. Puisque Qt fournit des classes de conteneur de type STL, nous les utilisons plutôt que d’append la STL à notre projet.

J’ai rencontré des problèmes en utilisant STL dans du code multi-thread. Même si vous ne partagez pas les objects STL entre les threads, de nombreuses implémentations utilisent des constructions non sécurisées (comme ++ pour le comptage de références au lieu d’un style d’incrémentation verrouillée ou ayant des allocateurs non thread-safe).

Dans chacun de ces cas, j’ai quand même choisi d’utiliser STL et de résoudre les problèmes (il y a suffisamment de crochets pour obtenir ce que vous voulez).

Même si vous choisissez de créer vos propres collections, il serait judicieux de suivre le style STL pour les iterators afin de pouvoir utiliser des algorithmes et d’autres fonctions STL fonctionnant uniquement sur des iterators.

Le principal problème que j’ai rencontré est de devoir intégrer un code hérité qui repose sur un nouvel opérateur non lanceur.

J’ai commencé à programmer C vers 1984 environ et je n’ai jamais utilisé la STL. Au fil des années, j’ai déployé mes propres bibliothèques de fonctions et celles-ci ont évolué et se sont développées lorsque la STL n’était pas encore stable et / ou ne disposait pas d’un support multi-plateforme. Ma bibliothèque commune a grandi pour inclure du code par d’autres (principalement des choses comme libjpeg, libpng, ffmpeg, mysql) et quelques autres et je préfère garder la quantité de code externe au minimum. Je suis sûr que maintenant la STL est géniale, mais franchement, je suis satisfaite des éléments de ma boîte à outils et je ne vois aucun besoin de la charger avec d’autres outils. Mais je vois certainement les grandes avancées que les nouveaux programmeurs peuvent faire en utilisant la STL sans avoir à coder tout cela à partir de rien.

Le standard C ++ permet perversement des implémentations de certaines opérations d’iterators pour lancer des exceptions . Cette possibilité peut être problématique dans certains cas. Vous pouvez donc implémenter votre propre conteneur simple, qui ne garantit pas les exceptions pour les opérations critiques.

Introduction:

STL est une bibliothèque géniale, utile dans de nombreux cas, mais elle ne résout pas définitivement toutes les situations. Répondre à STL ou! STL, c’est comme répondre “Est-ce que STL répond à vos besoins ou non?”

Avantages de STL

  • Dans la plupart des cas, STL dispose d’un conteneur adapté à une solution donnée.
  • C’est bien documenté
  • C’est bien connu (les programmeurs le savent déjà, entrer dans un projet est plus court)
  • Il est testé et stable.
  • C’est une plateforme croisée
  • Il est inclus avec chaque compilateur (n’ajoute pas de dépendance à la 3ème bibliothèque)
  • STL est déjà implémenté et prêt
  • STL est shiny, …

Contras du STL

Il n’est pas important que vous ayez besoin d’un simple graphique, d’une arborescence rouge-noire ou d’une firebase database très complexe d’éléments avec une intelligence artificielle gérant un access simultané via un ordinateur quantique. Le fait est que le TSL ne le fait pas et ne résoudra jamais tout.

Les aspects suivants ne sont que quelques exemples, mais ils sont essentiellement la conséquence de ce fait: STL est une véritable bibliothèque avec des limites.

  • Exceptions: le relais STL sur les exceptions, donc si pour une raison quelconque vous ne pouvez pas accepter les exceptions (par exemple, critique de sécurité), vous ne pouvez pas utiliser STL. Droite! les exceptions peuvent être désactivées, mais cela ne résout pas la conception de la STL qui les relaie et finira par entraîner un plantage.

  • Besoin de structure de données spécifique (pas encore incluse): graphique, arborescence, etc.

  • Contraintes particulières de complexité: vous pourriez découvrir que le conteneur STL à usage général n’est pas le plus optimal pour votre code de goulot d’étranglement.

  • Considérations sur la concurrence: Vous avez besoin de la concurrence et la STL ne fournit pas ce dont vous avez besoin (par exemple, le verrou du lecteur-écrivain ne peut pas être utilisé facilement à cause de l’ [] operator bidirectionnel [] operator . Soit vous pouvez concevoir un conteneur bénéficiant du multi-threading pour un access / recherche / insertion / autre plus rapide.

  • Le STL doit répondre à vos besoins, mais le revers est également vrai: vous devez répondre aux besoins du TSL. N’essayez pas d’utiliser std::vector dans un microcontrôleur intégré avec 1 Ko de RAM non gérée.

  • Compatibilité avec d’autres bibliothèques: Pour des raisons historiques, il se peut que les bibliothèques que vous utilisez n’acceptent pas le langage STL (par exemple, QtWidgets l’utilise de manière intensive). La conversion des conteneurs dans les deux sens peut ne pas être la meilleure solution.


Implémenter votre propre conteneur

Après avoir lu cela, vous pourriez penser: ” Eh bien, je suis sûr que je peux faire quelque chose de mieux pour mon cas spécifique que le fait le STL.

L’implémentation correcte de votre conteneur devient très rapidement une tâche énorme: il ne s’agit pas seulement de mettre en œuvre quelque chose, vous devrez peut-être:

  • Documentez-le en profondeur, y compris les limitations, la complexité des algorithmes, etc.
  • Attendez-vous à des bugs, et à les résoudre
  • Besoins supplémentaires entrants: vous savez, cette fonction manque, cette conversion entre types, etc.
  • Après un certain temps, vous pourriez vouloir refactoriser et modifier toutes les dépendances (trop tard?)
  • ….

Le code utilisé au plus profond du code comme un conteneur est définitivement quelque chose qui prend du temps à mettre en œuvre et qui devrait l’être avec précaution.


Utilisation d’une bibliothèque tierce

Non STL ne signifie pas nécessairement coutume. Il y a beaucoup de bonnes bibliothèques sur le net, certaines même avec une licence open source permissive.

L’ajout ou non d’une bibliothèque tierce supplémentaire est un autre sujet, mais cela vaut la peine d’être considéré.