Question

public:
     inline int GetValue() const {
          return m_nValue;
     }
     inline void SetValue(int nNewValue) {
          this -> m_nValue = nNewValue;
     }

En savoir C ++ , ils ont dit qu'il serait courir plus vite. Donc, je pensais que ce serait génial d'utiliser sur des accesseurs. Mais peut-être, il y a quelques inconvénients à elle?

Était-ce utile?

La solution

Je fais rien ne en ligne jusqu'à ce qu'un profileur m'a spécifiquement dit que non inline se traduit par un problème de performance.

Le compilateur C ++ est très intelligent et sera presque certainement en ligne automatiquement cette fonction simple comme cela pour vous. Et généralement, il est plus intelligent que vous êtes et fera un bien meilleur travail à déterminer ce qui devrait ou ne devrait pas être inline.

J'éviter de penser à quoi ou non en ligne et de se concentrer sur la solution. Ajout du mot-clé inline plus tard (ce qui est une garantie de ligne BTW) est très facile à faire et des endroits potentiels se trouve facilement avec un profileur.

Autres conseils

Si vous les écrire dans la définition, ils sont considérés comme inline par défaut .

Cela signifie qu'ils seront autorisés dans plusieurs unités de compilation (elles-mêmes semblent généralement car les définitions de classe dans plusieurs unités de compilation), pas qu'ils seront effectivement être inline.

est une mauvaise pratique dans l'API publique est Toute modification de ces fonctions nécessite recompilation de tous les clients.

En général ayant des accesseurs est mauvaise abstraction montrent, ne le font pas. Si vous allez en permanence aux données brutes dans une autre classe, alors vous avez probablement besoin de re organiser vos classes, au lieu d'examiner comment vous souhaitez manipuler les données au sein d'une classe et de fournir des méthodes appropriées pour le faire.

Points négatifs:

  1. Le compilateur est libre de vous ignorer.

  2. Toute modification de ces fonctions nécessite recompilation de tous les clients.

  3. Un bon compilateur inline fonctions non inline de toute façon quand il est approprié.

Je tiens aussi à ajouter que si vous effectuez des millions de jeux / obtient par image, il est à peu près hors de propos si ceux-ci sont inline ou non. Il est franchement pas la peine de perdre le sommeil sur.

De plus, gardez à l'esprit que juste parce que vous mettez le mot « en ligne » devant votre déclaration + définition, ne signifie pas le compilateur inline votre code. C'est des utilisations diverses heuristiques pour travailler s'il est logique, ce qui est souvent le commerce classique hors de la vitesse par rapport taille. Il y a cependant la force brute « __forceinline » mot-clé, à la location en VC ++ (je ne suis pas sûr de ce qu'il est dans GCC), qui piétine sur les compilateurs heuristiques de fantaisie. Je ne recommande vraiment pas du tout, et d'ailleurs une fois que vous port à une architecture différente, il sera probablement incorrect.

Essayez de mettre toutes les définitions de fonction dans le fichier de mise en œuvre, et de laisser les déclarations pures pour les en-têtes (à moins bien sûr que vous êtes la, auquel cas métaprogrammation modèle (STL / BOOST / etc), à peu près tout est dans les en-têtes ;))

L'une des personnes classiques des endroits comme à roues alignées (au moins dans les jeux vidéo, ce qui est d'où je viens), est en-têtes mathématiques. Cross / point produits, longueurs de vecteur, compensation de la matrice, etc sont souvent placés dans l'en-tête, que je pense est tout simplement inutile. 9/10 ne fait aucune différence à la performance, et si vous avez besoin de faire une boucle serrée, comme la transformation d'un large éventail de vecteur par une matrice, vous êtes probablement mieux faire manuellement la ligne de mathématiques, ou encore mieux coder en assembleur spécifique à la plate-forme.

Oh, et un autre point, si vous sentez que vous avez vraiment besoin d'une classe pour être plus de données que le code, envisagez d'utiliser le bon vieux struct, qui ne met pas les bagages OO de l'abstraction avec elle, c'est ce qu'il est là pour ça. :)

Désolé, n'a pas l'intention de continuer tant, mais je pense que cela aide à tenir compte des cas réels d'utilisation du monde, et pas trop accroché sur les paramètres du compilateur pédants (croyez-moi, je suis passé par là;))

Bonne chance.

Shane

Le code compilera un peu plus et vous perdez l'encapsulation. Tout dépend de la taille du projet et sa nature. Dans la plupart des cas, il est OK pour les faire en ligne si elles n'ont pas de logique complexe.

BTW, vous pouvez sauter inline si vous implémentez directement dans la définition de la classe.

En plaçant le code dans l'en-tête, vous exposez vos travaux internes de classe. Les clients peuvent voir cela et des hypothèses faites sur la façon dont fonctionne votre classe. Cela peut rendre plus difficile de changer votre classe plus tard, sans casser le code client.

Je dirais que vous ne avez pas besoin de se soucier de cela. Lire la FAQ section sur inline .

Pas besoin, commencer à faire confiance aux compilateurs, au moins pour ces optimisations!
"Mais pas toujours"

Le mot-clé en ligne n'a pas de sens dans votre cas

Compiler inline votre fonction si elle peut et veut, quel que soit par mot clé.

Le mot-clé inline affecte la liaison et non inline. Il est un peu déroutant, mais lu sur le sujet.

Si la définition est dans une unité de compilation différente (fichier source après préprocesseur, essentiellement) que l'appel, inline ne sera possible que si l'optimisation ensemble du projet et lien génération de code temporel sont activés. L'activation augmente considérablement le temps liaison (car il re-compile pratiquement tout dans l'éditeur de liens), mais peut évidemment améliorer les performances. Je ne sais pas si elle est ou désactivée par défaut dans GCC et VS.

Je dois dire que je n'ai pas l'aversion forte à cette pratique que les autres sur ce fil semblent avoir. Je suis d'accord que le gain de performance de inline est négligeable dans l'ensemble, mais le plus utilisé des cas. (Et oui, je Vous de tels cas rencontrés dans la pratique.) Si je fais ce genre de inline, je le fais pour des raisons pratiques, et généralement juste pour une seule ligne comme celui-ci. Dans la plupart de mes cas d'utilisation, la nécessité d'éviter recompilation du côté client si jamais je les change est tout simplement pas forte.

Oui, vous pouvez laisser tomber le inline, car il est sous-entendu par le placement de la mise en œuvre.

De plus, je suis un peu surpris par la véhémence contre accesseurs. Vous pouvez à peine éternuer à une classe dans toutes les langues OO sans souffler un peu vers le bas, et ils sont après tout une technique valide pour la mise en œuvre abstraite de l'interface, il est donc un peu masochiste pour les réclamer comme une mauvaise pratique OO. Il bon conseil de ne pas accesseurs d'écriture sans distinction, mais je vous conseille également de ne pas se laisser emporter dans le zèle pour les éradiquer.

Prends ça, les puristes. : -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top