Question fonctions pure / const en C ++ 0x


En C ++ 98 / C ++ 03, il n'y a pas de mots-clés pur / const dans la langue

  1. Est-ce que cela a changé en C ++ 0x?

  2. Si oui, est-il possible de définir un tel drapeau même sur des objets de fonction (std::function)? Donc, je peux passer des fonctions de pointeur ou des fonctions lambda et donner des informations supplémentaires que c'est une fonction pure / const? La fonction appelée peut avoir un chemin d'exécution optimisé pour une telle fonction.

  3. Est-il possible de vérifier si une fonction donnée est pure / const? C'est à dire. par exemple, s'il y a un tel drapeau std::function comme décrit ci-dessus, je pourrais probablement vérifier ce drapeau. Mais peut-être y a-t-il même une manière plus générale.

Si cela n'a pas changé, pourquoi pas? Je pense qu'il pourrait être très utile d'avoir un tel soutien.

Y a-t-il des propositions ouvertes à ce sujet?


10
2017-09-26 21:25


origine


Réponses:


  1. Est-ce que cela a changé en C ++ 0x?

Non, il y a un constexpr mais cela signifie une constante de temps de compilation. Si ses paramètres sont constexprs de plus, il est exécuté au moment de la compilation, mais c'est une fonction normale sinon. Comme ils doivent être définis dans la même unité de traduction et constitués d'une seule déclaration de retour, ils seront probablement intégrés et l'optimisation ci-dessus sera effectuée. Il ne peut pas être utilisé pour fournir les informations du compilateur sur la fonction liée en externe.

Si cela n'a pas changé, pourquoi pas? Je pense qu'il pourrait être très utile d'avoir un tel soutien.

En fait, je ne pense pas que tu en a besoin. Le langage est déjà trop gros et le programmeur peut facilement réécrire ce code pour être plus efficace en fonction de ses connaissances. contrairement à restrict il ne fournit aucune information qui ne peut être exprimée par d'autres moyens.

Y a-t-il des propositions ouvertes à ce sujet?

Je n'ai vu aucun document de comité sur ce sujet.


8
2017-09-26 21:38



gcc utilise __attribute__(( <attr> )) définir attributs supplémentaires sur les fonctions.

  • pur: accède uniquement (mais ne modifie pas) les paramètres et la mémoire globale. GCC utilise ces informations pour déterminer si l'optimiseur peut complètement omettre les appels répétés à la fonction (mémorisation locale). Deux fonctions pures notables sont strlen et memcmp.

  • const: à ne pas confondre avec C ++ const, les fonctions const n'accèdent qu'aux paramètres et ces paramètres ne doivent pas être des pointeurs. C'est fondamentalement une version plus restreinte de pure. L'optimiseur traite const fonctions identiques à pure. Bien qu'en théorie, il puisse effectuer une mémorisation plus agressive (non locale) que pour pure.

La nouvelle syntaxe d'attribut de C ++ 11 (§7.6) a été conçue pour faire ce genre de chose. Actuellement, vous ne pouvez pas utiliser la syntaxe d'attribut de C ++ pour définir les attributs GCC, mais cela changera dans les futures versions de gcc.

Donc, vous pourrez assigner le pure attribuer aux fonctions en utilisant la syntaxe d'attribut. Mais il n'y a pas de norme pure attribut. pure sera spécifique au compilateur, mais cela fera le bon choix sur gcc.

Pour les curieux, voici la liste des attributs standard:

  • aligner
  • non-retour
  • passer outre
  • cache
  • base_check
  • carry_dependency

6
2017-09-28 16:21