À partir de différentes comparaisons entre les modèles C ++ et les génériques C # / Java comme celui-ci-
J'ai l'impression que les modèles C ++ sont implémentés par une sorte de prétraitement (remplacement de texte brut avant l'analyse), et non par compilation. Parce que la vérification de type dans les modèles C ++ ressemble aux macros C. Je veux dire, s'il y a des erreurs, ce sont des erreurs du code généré après le traitement des blocs de code modèles, pas des modèles eux-mêmes. En d'autres termes, ils ne sont qu'une sorte de version supérieure des macros en C.
Ensuite, j'ai trouvé d'autres faits à l'appui de cela-
Je pensais que si les modèles C ++ étaient implémentés par prétraitement, il y aurait des problèmes avec la liaison dynamique (en utilisant .dll). Et une recherche rapide sur Google l'a soutenu.
Un autre point est que les constantes entières peuvent être passées comme arguments aux modèles. Et il prend même en charge une sorte de récursivité. Mais cette récursivité n'est pas trouvée dans le code assemblé / machine compilé. La chose récursive est gérée au moment de la compilation en générant une fonction pour chaque appel récursif et en ayant ainsi un binaire exécutable plus grand mais plus rapide.
Bien que contrairement aux macros C, il possède des capacités supérieures. Mais le modèle C ++ n'est-il pas implémenté avec une sorte de prétraitement? Comment est-ce implémenté dans différents compilateurs C ++?
Réponses:
Les modèles C ++ sont une sorte de macros Lisp abrégées (ou même plus, Scheme). C'est un langage Turing-complet qui évalue au moment de la compilation, mais il est sévèrement limité car il n'y a pas d'accès de ce langage à l'environnement C ++ sous-jacent. Donc, oui, les modèles C ++ peuvent être considérés comme une forme de prétraitement, avec une interaction très limitée avec le code généré.
la source
La plus grande différence est probablement que les macros C sont développées dans la phase de prétraitement, avant toute autre compilation, tandis que les modèles C ++ font partie de la compilation. Cela signifie que les modèles C ++ sont sensibles au type et étendus, entre autres, et ne sont pas de simples substitutions textuelles. Ils peuvent se compiler en fonctions réelles et éviter ainsi la plupart des problèmes rencontrés par les macros. Être conscient du type signifie qu'ils peuvent être généraux ou spécialisés: par exemple, il est facile de fournir une
swap
fonction de modèle et d'écrire des spécialisations qui fonctionnent bien même si les objets gèrent la mémoire de tas.Par conséquent: les modèles C ++ ne sont pas de prétraitement dans le même sens que les macros, ils ne sont pas une sorte de macro C et il est impossible d'utiliser des macros C pour dupliquer ce que font les modèles.
Les modèles vivent dans des fichiers d'en-tête, pas dans des bibliothèques liées, c'est vrai, mais si vous fournissez un fichier .dll, vous fournissez probablement un fichier d'en-tête à utiliser.
la source
export
déjà été implémentés. Je sais que cela fonctionne pour les fonctions, mais je doute que cela fonctionne pour les classes: comment connaîtrez-vous leur taille?Est-il important de savoir comment ils sont mis en œuvre? Les premiers compilateurs C ++ n'étaient que des pré-processeurs qui alimentaient le code en un compilateur alternatif, cela ne signifie pas que C ++ n'est qu'une macro glorifiée.
Les modèles suppriment le besoin de macros en fournissant un moyen plus sûr, plus efficace et spécialisable (même je ne pense pas que ce soit un vrai mot) d'implémenter du code pour plusieurs types.
Il existe une variété de façons de faire du modèle de code de type en c, dont aucune n'est très agréable une fois que vous avez dépassé les types simples.
la source
Il y a quelques différences; par exemple, les modèles peuvent être utilisés pour instancier une surcharge de fonction en cas de besoin, tandis qu'avec les macros, vous devrez développer la macro une fois pour chaque surcharge possible afin de la rendre visible au compilateur, vous vous retrouverez donc avec beaucoup de code inutilisé.
Une autre différence est que les modèles respectent les espaces de noms.
la source
À mon humble avis, les modèles C ++ et les macros C étaient censés résoudre deux problèmes entièrement différents. La bibliothèque de modèles standard C ++ d'origine était un mécanisme permettant de découpler proprement les classes de conteneurs (tableaux, listes chaînées, etc.) des fonctions génériques qui leur sont généralement appliquées (comme le tri et la concaténation). Avoir des représentations abstraites d'algorithmes efficaces et de structures de données conduit à un code plus expressif car il y avait beaucoup moins de conjectures sur la meilleure façon d'implémenter une fonction travaillant sur une donnée particulière. Les macros C étaient beaucoup plus conformes à ce que l'on verrait généralement dans les macros Lisp, en ce sens qu'elles fournissaient un moyen d'étendre le langage avec du code intégré. Ce qui est cool, c'est que la bibliothèque standard C ++ a étendu les fonctionnalités des modèles pour couvrir la grande majorité de ce que nous utilisons #définir en C.
la source