Bien sûr, vous pouvez détecter les fonctions pures dans certains cas. Par exemple,
int f(int x)
{
return x*2;
}
peut être détecté comme pur, simple analyse statique. La difficulté est de faire cela en général, et la détection des interfaces qui utilisent "interne" de l'état, mais à l'extérieur pur est fondamentalement impossible.
GCC n'ont les options d'alerte -Wsuggest-attribute=pure
et -Wsuggest-attribute=const
, qui suggèrent des fonctions qui pourraient être candidats à l' pure
et const
attributs. Je ne suis pas sûr qu'il choisit d'être conservateur (c'est à dire s'il manque beaucoup de fonctions pures, mais jamais il suggère, pour un non-fonction pure) ou permet à l'utilisateur de décider.
Notez que GCC de la définition de l' pure
est "dépendant uniquement sur des arguments et des variables globales":
De nombreuses fonctions ont pas d'effets à l'exception de la valeur de retour et leur valeur de retour ne dépend que des paramètres et/ou des variables globales. Une telle fonction peut être soumis à des courants sous-expression de l'élimination et de l'optimisation en boucle comme un opérateur arithmétique serait. Ces fonctions doivent être déclarés avec l'attribut pure
.
- Manuel de GCC
Strictes de pureté, c'est à dire les mêmes résultats pour les mêmes arguments, en toutes circonstances, est représenté par l' const
d'attribut, mais cette fonction ne peut pas même de déréférencement d'un pointeur passé à elle. Donc, la parallélisation des opportunités pour pure
les fonctions sont limitées, mais beaucoup moins de fonctions peuvent être const
par rapport à la pure fonctions que vous pouvez écrire dans une langue comme Haskell.
Par la voie, automatiquement parallelising fonctions pures n'est pas aussi facile que vous le pensez; la partie la plus difficile devient de décider ce que paralléliser. Paralléliser les calculs qui sont trop pas cher, et les frais généraux, le rend inutile. Ne pas paralléliser assez, et vous n'avez pas récolter les bénéfices. Je ne sais pas du tout pratique et fonctionnelle de la langue mise en œuvre qui ne la parallélisation automatique pour cette raison, et bien que les bibliothèques comme repa paralléliser de nombreuses opérations en arrière-plan sans parallélisme explicite dans le code de l'utilisateur.