88 votes

C ++: Est-ce une bonne pratique de rendre les accesseurs en ligne?

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

Sur Learn C ++, ils ont dit que cela fonctionnerait plus vite. Alors, j'ai pensé que ce serait génial.
Mais peut-être, il y a quelques points négatifs à cela.

79voto

JaredPar Points 333733

Je n'ai pas inline rien jusqu'à ce qu'un profiler a aussi spécifiquement m'a dit que non inline entraîne un problème de performance.

Le compilateur C++ est très intelligent et sera presque certainement automatiquement inline telle fonction simple comme ça pour vous. Et généralement, c'est plus intelligent que vous, et va faire un bien meilleur travail à la détermination de ce qui devrait ou ne devrait pas être insérée.

Je voudrais éviter de penser à ce que à ou de ne pas en ligne et se concentrer sur la solution. L'ajout de l' inline mot-clé plus tard (ce qui n'est pas une garantie de inline BTW) est très facile à faire et de lieux potentiels peuvent être trouvés facilement avec un profiler.

32voto

AraK Points 38702

Si vous les écrivez dans la définition, ils sont en ligne par défaut .

16voto

Greg Domjan Points 5953

Ceci est une mauvaise pratique dans les API publiques. Toute modification de ces fonctions nécessite une recompilation de tous les clients.

En général, avoir des getters et des setters montre une mauvaise abstraction, ne le faites pas. Si vous consultez constamment les données brutes d'une autre classe, vous devrez probablement réorganiser vos classes. Vous devrez plutôt envisager la manière dont vous souhaitez manipuler les données d'une classe et fournir les méthodes appropriées.

11voto

Crazy Eddie Points 23778

Points négatifs:

1) Le compilateur est libre de vous ignorer.

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

3) Un bon nombre de compilateurs intègrent de toute façon des fonctions non intégrées, le cas échéant.

5voto

Shane Points 1393

Je tiens également à ajouter que si vous effectuez des millions de obtient ou définit par le cadre, c'est à peu près hors de propos, si elles sont intégrées ou non. C'est franchement pas la peine de perdre le sommeil plus de.

Aussi, gardez à l'esprit que juste parce que vous mettez le mot 'inline' en face de votre déclaration de+définition, ne signifie pas que le compilateur inline votre code. Il utilise différentes heuristiques pour déterminer si elle fait sens, ce qui est souvent le classique échange de la vitesse et de la taille. Cependant, il est la force brute '__forceinline mot-clé, à la location dans VC++ (je ne suis pas sûr de ce qu'il est en CCG), qui piétine sur les compilateurs de fantaisie heuristiques. Je ne recommande pas du tout, et en plus une fois que vous port pour une architecture différente, ça risque d'être incorrecte.

Essayez de mettre toutes les définitions de fonctions dans le fichier d'implémentation, et de laisser la pure déclarations pour les en-têtes (sauf si bien sûr vous êtes modèle de la métaprogrammation (STL/BOOST/etc), dans ce cas, à peu près tout est dans les en-têtes ;))

L'un des lieux classiques de gens aiment à en ligne (au moins dans les jeux vidéo, qui est d'où je suis originaire), en mathématiques, en-têtes. La croix-point des produits, les longueurs de vecteur, d'une matrice de compensation, etc sont souvent placées dans l'en-tête, qui je pense n'est pas nécessaire. 9/10 il ne fait aucune différence de performance, et si jamais vous avez besoin de faire une boucle serrée, tels que la transformation d'un grand vecteur matrice par la matrice, vous êtes probablement mieux manuellement de faire le calcul à la volée, ou encore mieux de codage dans la plate-forme de l'assembleur.

Oh, et un autre point, si vous vous sentez vraiment besoin d'une classe pour être plus de données que le code, pensez à utiliser la bonne vieille structure, qui n'apporte pas la OO bagages de l'abstraction avec elle, c'est tout ce qui existe. :)

Désolé, je ne voulais pas aller sur beaucoup de choses, mais je pense juste qu'il aide à considérer monde réel de cas d'utilisation, et ne pas avoir trop accroché sur pédant paramètres du compilateur (faites-moi confiance, je suis là ;))

Bonne chance.

Shane

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X