Recherche un mot clef pour les fonctions

Recherche un mot clef pour les fonctions - C++ - Programmation

Marsh Posté le 15-11-2008 à 00:25:17    

Salut,
 
il y a quelques mois j'avais lu quelque chose a propros d'un certain mot clef que je n'arrive pas a retrouver.
 
Le principe etait que si une fonction depend uniquement de ses parametres (donc pas de rand, ou de dependances sur le temps ou sur une variable volatile), le compilateur pouvait mettre en memoire le resultat afin d'optimiser au prochain appel.
 
 
Genre:
 

Code :
  1. int foo (int a)
  2. {
  3.    return a + 2;
  4. }
  5. void main()
  6. {
  7.    foo(5);
  8.    foo(5);
  9. }


 
foo ici ne serait appeler qu'une fois et la 2e fois le resultat est deja en memoire.
Dans ma memoire il s'agissait de fonctions dites 'pure' mais en cherchant sur ce mot clef je ne trouve que 'virtual pure'...
 
 
Merci!


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 15-11-2008 à 00:25:17   

Reply

Marsh Posté le 15-11-2008 à 09:21:08    

Sous gcc tu as __attribute__((pure)) et __attribute__((const)), mais sinon rien de portable.
Tu peut enrober chaque attribut dans une macro et faire varier la macro selon les compilos.


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 15-11-2008 à 10:44:25    

malheureseument à part ça,  ca va pas loin. Et le pure de gcc n'est pas le pure des langages fonctionnels.
 
Ensuite, le faite de "mémoiser" le résultat comme tu semble le désiré n'est pas une propriété fondamentale des fonctions pures.

Reply

Marsh Posté le 19-11-2008 à 00:13:51    

ok c'etait donc bien fonction pure :jap:
 
Est-ce que cela a vraiment un interet? Vaut-il mieux coder soit meme ce genre de chose avec une table de hashage?
 
Merci


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 19-11-2008 à 00:54:29    

gee a écrit :

ok c'etait donc bien fonction pure :jap:
 
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 :
  1. float a = 1.0f;
  2. float b = 2 * bidule(sin(a)) ;
  3. 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 :
  1. float a = 1.0f;
  2. float tmp = bidule(sin(a));
  3. float b = 2 * tmp ;
  4. 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.
Reply

Marsh Posté le 19-11-2008 à 02:15:12    

oki je vois.
 
Merci pour les informations. :jap:


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 19-11-2008 à 08:45:37    

0x90 a écrit :


<des trucs>


N'y a t il pas glissement de sens par rapport au fonctions pures issus des langages fonctionnels ?
http://en.wikipedia.org/wiki/Pure_function

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed