Les templates-Expressions [Meta-prog] - C++ - Programmation
Marsh Posté le 29-07-2003 à 14:01:57
Bon un exemple concret, un peu brutale mais bon.
le but du jeu est d'utiliser les E.T vu ci dessus pour générer du
code arithmétiques sur des classes du types Vecteur ou matrices.
Style :
Code :
|
et généré un code sans recopie ni objets temporaires, stadire :
Code :
|
ce qu'AUCUN COMPILATEUR NE SAIT FAIRE AUTOMATIQUEMENT je precise ...
Voila le code, il utilise le même style de code que précédemment :
Code :
|
Voila quelquechose de + concret peut etre
gain de perf garanti pour des tres garande expressions
Marsh Posté le 29-07-2003 à 09:16:14
Voila, apres le premier post sur la MPT, je récidive avec cette fois quelque chose de plus burné : Les Expressions Templates.
Tout d'abord je tiens à signaler que ce post est une tentative d'adaptation des articles de Todd Veldhuizen, ze Boss en MPT, créateur de la librairie Blitz++ en autre.
Note : Cette explication fait partie de mes travaux de DEA
1. Principes
Considérons une fonction qui cacule l'intégrale d'une fonction mathématique.
Un moyen "classique" de l'implementer est d'utiliser un pointeur de fonction :
Simple, efficace, pas de problème. SAUF que si cette fonction est une part critique de votre application, le déréférencement de pointeur va peut etre commencer à devenir tres tres handicapant.
Il serait agréable de pouvoir ecrire quelque chose comme :
et de voir se dérouler le code de l'intégration :
Comment faire ?
2. Une Solution Elégante : Les Expressions templates
Lorsque l'on manipule ce genre d'expression, on peut considérer qu'elles sont l'application d'une grammaire restreinte, contenant juste des valeurs, des opérateurs et des expressions. A partir de la on peut reconstruire un ensemble de classe pour réécrir ces expressions :
Il nous faut d'abord une classe pour représenté les variables et les constantes
Ensuite, il nous font pouvoir coder les divers opérateurs d'une expression
arithmétique. Cantonnons nous au opérateurs bianires de bases : +,-,/,*.
Qu'est-ce qu'un operateur binaire : c'est une opération ET un noeud d'una rbre de syntaxe abstraite ayant deux fils. Ces deux aspects de l'opérateurs se retrouvent dans deux familles de classes :
Il nous reste à coder une classe pour encapsuler une expression quelconque :
Voila, nous avaons toute nos briques. Comment alors reconstruire à partir de ces classes une expression arithmétique et l'évaluez en ligne ?
Trés simplement, nous allons redéfinir les opérateurs +,-,*,/ sur les types Variable, Constante et Expression et reconstruire au sein de ces opérateurs l'arbre de syntaxe de l'expression :
Voila, rajoutez a cela les opérateurs -,*,/, la surcharge pour gérer les constantes numériques :
En écrivant du code comme :
Nous générons par instanciation récursives des templates le code suivant :
C'est gaagné
cette technique permet aussi via quelques modifications mineurs de
générer du code arithmétique vectoriel ou matriciel inline trés performant, éliminant toutes recopies d'objets temporaires et augmentant les performances d'un facteurs 3 ou 4, faisant du C++ un langage aussi rapide que le C.
On peut aussi ecrire des classes pour générer du code inline de parser/lexer à la YACC, des filtres de flux, du TI rapide (oops la c'est mon job ) bref, des infinités d'applications.
EDIt : typo/ortho
Message édité par Joel F le 29-07-2003 à 10:19:30