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.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas forcer la ligne. Aussi, les appels de fonction sont assez bon marché sur les Processeurs modernes, par rapport au coût du travail accompli. Si vos fonctions sont assez grand pour avoir besoin d'être brisé, le temps additionnel pour faire l'appel sera essentiellement rien.
À défaut, vous pourriez ... essayer ... pour utiliser une macro.
Il n'y a rien qui vous empêche de mettre inline dans une fonction statique dans un .fichier cpp.
Certains compilateurs ont la possibilité de forcer une fonction inline, voir par ex. la CGC attribut((always_inline)) et une tonne d'options pour affiner l'alignement des optimisations (voir -minline-* paramètres).
Ma recommandation est d'utiliser inline ou encore mieux static inline où bon vous semble, et laisser le compilateur décider. Ils ne sont généralement assez bien.
Non,
inline
est un recommandation pour le compilateur ; il n'a pas le forcer à faire quoi que ce soit. Aussi, si vous travaillez avec MSVC++, notez que__forceinline
est un abus de langage que de bien ; c'est juste une plus forte recommandation deinline
.__forceinline
est utilisée et que la fonction est insérée si elle peut l'être.inline
mot-clé (comme par votre question). Au plus, vous serez en mesure d'augmenter les chances d'être insérée./Wall
et en notant les fonctions qui n'étaient pas intégrées.C'est autant de la bonne vieille droite C car c'est le C++. Je réfléchissais l'autre jour, parce que dans un monde embarqué, où à la fois la vitesse et de l'espace doivent être gérés avec soin, cela peut vraiment d'importance (par opposition à la trop souvent "ne vous inquiétez pas, votre compilateur est intelligent et la mémoire n'est pas cher répandue dans poste de travail/serveur de développement).
Un possible solution que je n'ai pas encore l'efp est d'utiliser les deux noms pour les différentes variantes, quelque chose comme
et puis
Ce serait donner une la possibilité d'appeler de manière sélective soit _max() et max() et pourtant toujours avoir de l'algorithme défini une fois et une fois seulement.
Compilateurs sont vraiment vraiment bon à la génération de code optimisé.
Je dirais juste organiser votre code en groupes logiques (à l'aide de fonctions supplémentaires si que l'amélioration de la lisibilité), marquant inline le cas échéant, et de laisser le compilateur de décider quel est le code pour générer de manière optimale.
inline
est utilisé comme une alternative à des macros, car ils sont debuggable, plus lisible et peut être mis dans un espace de noms. Parfois, la trame de pile allocation peut accumuler de précieux microsecondes de retard, et le compilateur ne connaissez pas la fréquence d'exécution sans le contexte (si vous inline unsin()
fonction et le compilateur ne pas l'inclure pour une raison quelconque?).VS Profil Guidée Optimisations