gee a écrit :
ok c'etait donc bien fonction pure
Est-ce que cela a vraiment un interet? Vaut-il mieux coder soit meme ce genre de chose avec une table de hashage?
Merci
|
Tu n'aura pas le même effet avec une table de hashage.
Avec le __attribute__((pure)), mettons que tu ait une fonction bidule qui soit pure, et que tu fasse :
Code :
float a = 1.0f; float b = 2 * bidule(sin(a)) ; float c = 17 * bidule(sin(a));
|
GCC aura le droit de n'exécuter qu'une seule fois la portion bidule(sin(a)), parceque bidule et sin sont pures, donc l'expression complète est pure. le pure sert essentiellement à autoriser GCC à réécrire le code sous cette forme :
Code :
float a = 1.0f; float tmp = bidule(sin(a)); float b = 2 * tmp ; float c = 17 * tmp;
|
Si maintenant bidule n'est pas noté comme étant pure, mais utilise une table de hashage pour mémoizer un calcul lourd, sin(a) pourra n'être éxécuté qu'une seule fois, mais bidule( ) devra obligatoirement être exécutée 2x, GCC ne sait pas que c'est inutile. (et la seconde fois ça utilisera ta table de hashage, mais ce sera pas aussi bien que de pas avoir appelé du tout la fonction...).
Par contre, si ta fonction bidule est utilisé dans différents scopes impossible à prédire pour gcc (par exemple un truc du genre fibonacci récursif), même si bidule est pure, il ne sera pas capable de voir 2 appels avec les même paramètres entre différents scopes, alors que la table de hashage le permettra.
---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.