oui clairement les operateurs n optimisent rien, mais ils aident a l ecriture, et ce bcp lorsqu on optimise (a l aide de template par exemple).
@godrik: mon code est une version un peu plus safe et cross-platforme d un article (gamedev?), bizarre que je l ai pas mentionne, je vais regarder dans mon sourcesafe car je suis sur que j avais le lien dans mes commentaires. L article etait tres bien, et expliquait en profondeur tout cela.
Mon code a deux principaux objectifs:
- ne pas avoir d objets temporaires lorsqu on peut s en passer
- evaluer les x,y,z separement, et une seule fois (si possible) par expression (pour eviter de devoir sauver des variables sur la pile)
Ca se fait a l´aide de template: l´idee est de travailler sur des expressions a la place de vecteurs. Par exemple si tu as k= a*i+b*j; comme cite plus haut, voici ce qui se passe (en simplifie, et dans l ordre)
a*i -> cree un vec_exp2<vector3d,float,mul> (appelons ca expA)
b*j -> cree un vec_exp2<vector3d,float,mul> (expB)
expA*expB -> cree un vec_exp2<type de expA,type de expB,mul> (expC)
k = expC va appeller une fonction inline, qui va evaluer d abord expC.evaluate(0) pour x, expC.evaluate(1) pour y, etc.
Comme tout est inline et comme on utilise partout des references constantes, aucune des expressions n est vraiment stockee en memoire/stack, ce qui est bien pratique. Le code source en sortie est bien impressionant par rapport a une implementation habituelle, par contre si on veut faire du simd cette version est pourrie.
Sans les operateurs, ca deviendrait vraiment tres moche a ecrire.. vraiment..