Puis-je de manière sélective (force) inline-il une fonction?

Dans le livre Code Propre (et quelques autres que j'ai rencontré et lire) il est suggéré de garder les fonctions de petits et de les casser si ils deviennent grands. Il suggère également que les fonctions doivent faire une chose et une chose seulement.

Dans L'optimisation de logiciels en C++ Agner Brouillard déclare qu'il n'aime pas la règle de la rupture d'une fonction simplement parce qu'il franchit un certain seuil d'un certain nombre de lignes. Il affirme que cela se traduit par inutiles sauts qui dégrader les performances.

Tout d'abord, je comprends que ce ne sera pas grave si le code je suis en train de travailler sur n'est pas dans une boucle serrée, et que les fonctions sont lourd, de sorte que le temps qu'il faut pour appeler est rien en comparaison du temps le code de la fonction est à exécuter. Mais supposons que je travaille avec des fonctions de qui sont, la plupart du temps, utilisé par d'autres objets/fonctions et les performances sont relativement tâches insignifiantes. Ces fonctions de suivre les suggestions énumérées dans le premier paragraphe (qui est, d'exécuter une fonction unique et sont de petite/compréhensible). Puis j'ai commencer la programmation d'une critique pour les performances de la fonction qui utilise ces autres fonctions dans une boucle serrée, et est essentiellement une fonction d'encadrement. Enfin, supposons que la doublure a un avantage pour l'exécution des fonctions essentielles, mais aucun avantage pour toute autre fonction (oui, j'ai profilé, quoique avec beaucoup de copier-coller que je veux éviter).

Immédiatement, on peut dire que la balise de la fonction inline et de permettre au compilateur de choisir. Mais que faire si je ne veux pas l'ensemble de ces fonctions pour être dans un".inl fichier ou exposés dans l'en-tête? Dans ma situation actuelle, la performance des fonctions critiques et les autres fonctions qu'il utilise sont tous dans le même fichier source.

Pour résumer, je peux sélectivement (force) inline une fonction(s) pour une seule fonction, de sorte que la fin de code se comporte comme c'est une grosse fonction au lieu de plusieurs appels à d'autres fonctions.

  • Sauf si vous êtes en utilisant le préprocesseur, ce qui n'est pas du tout la même chose, tout ce que vous faites pour indiquer qu'une fonction doit être inline peuvent être ignorés par le compilier.
  • gcc offre l'option de Ligne de gain pour vous avertir des fonctions qui ont été marqués inline mais ne l'étaient pas. C'est un début mais pas de solution à votre problème.
  • Étant donné que les fonctions sont tous dans le bon fichier source, et ne sont pas utilisés ailleurs, je dirais juste marquer static inline et laisser le compilateur de s'en sortir. Si elle pense qu'elle va produire de meilleurs code par pas l'in-lining, qui sait, peut-être que c'est juste. Avez-vous été à spécifier un compilateur, on peut suggérer toutes les options qu'il a de la force de l'in-lining, mais puisque vous semblez vouloir une solution portable, c'est "laisser le compilateur d'optimiser, il en sait plus sur la plate-forme que vous faites, puisque vous savez rien de précis sur la plate-forme".
  • Ce fil est vieux, mais je viens de tombé sur. Je suis dans une situation où j'ai de terribles code qui je suis casser afin d'être en mesure de comprendre dans les classes et les petites fonctions. Lors de la création d'une surcharge, il est beaucoup plus probable que je suis en mesure d'optimiser le bon code écrit, si il y a une bouteille que je suis en mesure de fixer "rapide" du code.
  • Je pense qu'il devrait y avoir un moyen de le faire. J'ai créer ma version d'une fonction d'une STL algorithme et le compilateur GCC et clang, ne pas inline de la fonction et Il faut 10 fois plus de temps que la STL, et quand je colle la fonction à l'intérieur, il suffit de 0,9 X. Alors, ouais! est parfois nécessaire de forcer la ligne.
InformationsquelleAutor Samaursa | 2011-08-18