47 votes

Y a-t-il de la "magie" dans la STL?

Permettez-moi de commencer par expliquer ce que je veux dire par "magie". Je vais utiliser deux exemples de Java:

  1. Chaque classe hérite (directement ou indirectement) l' Object classe.
  2. La surcharge d'opérateur n'est pas pris en charge par Java, mais l' + opérateur est défini pour String objets.

Cela signifie qu'il est impossible de faire une mise en œuvre de l' Object et String classes dans le plus pur(*) de Java. Maintenant, c'est ce que je veux dire avec "magic": pour une mise en œuvre de ces classes, vous aurez besoin d'un soutien spécial du compilateur.

Ce que j'ai toujours aimé le C++, c'est que, autant que je sache, il n'existe pas de "magie" dans la STL, c'est à dire qu'il est possible de mettre en œuvre la STL en C++pur.

Maintenant, ma question est: est-ce vrai? Ou il y a des parties de la STL qui ne peuvent pas être mis en œuvre en C++ pur et ont besoin d'une "magie"/spéciale prise en charge du compilateur?


(*) Avec "pure", je veux dire sans l'aide des bibliothèques de classe.

52voto

gbjbaanb Points 31045

en d'autres termes, n'a rien été fait pour le compilateur afin de permettre un "cas particulier" de la STL nécessaires pour travailler?

Pas de.

Tout était mis en œuvre en tant que "pure" du code C++, en utilisant la magie des modèles.

Il y a eu un peu de travail pour les compilateurs pour améliorer la STL (je suis en train de réfléchir à diverses optimisations), mais sinon, non, vous pourriez écrire la totalité de la STL si tu le voulais vraiment. Certaines personnes n'ont - STLPort est une mise en œuvre qui n'ont pas le soutien d'un compilateur fabricant.

40voto

jalf Points 142628

Comme gbjbaanb correctement dit, la STL peut être mis en œuvre dans la plaine, C++, sans s'appuyer sur aucune sorte de compilateur "magie".

Toutefois, si vous allez creuser dans la STL code source de votre compilateur, vous aurez probablement voir le code n'est pas standard, ou que vous n'êtes pas censé écrire vous-même.

La STL peut être mis en œuvre entièrement en C++ standard, mais cela ne signifie pas que les rédacteurs de compilateur n'a pas permis d'améliorer de temps en temps, à l'aide du compilateur extensions spécifiques. Par exemple, ils peuvent insérer de code non standard qui assure le meilleur des messages d'erreur, ou peut-être des œuvres autour de certains faille dans leur compilateur, ou peut-être permet d'optimisations spéciales en utilisant les fonctionnalités propres à un compilateur.

Ils ont aussi toujours utiliser des noms que vous n'êtes pas autorisé à utiliser. Par exemple, les paramètres de modèle sont généralement nommé quelque chose comme _Type, ce qui, puisqu'il commence par un trait de soulignement suivi d'une lettre majuscule, est réservé pour la mise en œuvre. La bibliothèque standard est autorisé à les utiliser, mais vous et moi ne le sont pas. Donc, si vous allez écrire votre propre implémentation STL, vous devez faire quelques changements mineurs, mais ce n'est pas parce que de toute magie, juste une façon d'éviter les collisions de noms entre la bibliothèque standard et le code de l'utilisateur.

15voto

Drew Hall Points 15917

Comme d'autres l'ont dit, la STL est applicable dans le plus pur standard C++98. Ce qui n'a pas été dit, c'est que le développement de la TSL a été concomitante avec le développement du C++ mécanisme de template, et en grande partie conduit à l'inclusion de certaines fonctionnalités. Je crois que l' Argument de référence Dépendant (ADL, aka Koenig de Recherche), le modèle de paramètres de modèle, et le modèle par défaut arguments sont tous venus à C++ pour servir Stepanov de la STL de développement.

Donc, avec la STL, ils se sont déplacés de la magie dans la langue elle-même. Bien que le comité de normalisation reconnu que, si ces caractéristiques ont été utile pour ce qui allait devenir la bibliothèque standard, ils peuvent être utiles pour le reste d'entre nous!

14voto

AndreyT Points 139512

Si par STL vous voulez dire que le modèle de la partie de la norme C++ de la bibliothèque, il est tout à fait possible de la mettre en œuvre sans aucune "magie". Si chaque donnée de la mise en œuvre utilise en fait toute la "magie" est une autre question (il y a des parties de STL, où la "magie" pourrait l'aider, mais pas absolument nécessaire).

Maintenant, si vous parlez de l'ensemble de la Norme C++ de la Bibliothèque, alors il n'a, en effet, avoir un peu de "magie". L'exemple classique serait la bibliothèque fournie ::operator new et ::operator delete des implémentations. Nous appelons souvent "overloadable" dans le langage de tous les jours, alors qu'officiellement ils sont remplaçables. Langage C++ ne propose pas ce type de fonctionnalité pour l'utilisateur. L'utilisateur ne peut pas écrire un remplaçable fonction.

Un autre exemple serait l' offsetof macro (héritée de Bibliothèque C Standard). Alors qu'il est généralement mis en œuvre dans le pur "C", le populaire, la mise en œuvre est en fait illégal de former le pédant point de vue (provoque un comportement indéfini). Je n'ai pas vu officiellement juridique implémentations de offsetof, donc je ne suis pas sûr de savoir si ils sont encore possibles.

Un autre exemple serait (encore une fois, hérité de C) les macros pour travailler avec la variable d'arguments. Il est évident qu'ils ne peuvent pas être mis en œuvre dans le plus pur C ou C++.

10voto

FredOverflow Points 88201

Je suis presque sûr que certains type_traits requièrent la magie du compilateur, par exemple has_trivial_constructor , has_virtual_destructor ou is_pod .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X