Est-il préférable de faire des getters et setters inline?
public:
inline int GetValue() const {
return m_nValue;
}
inline void SetValue(int nNewValue) {
this -> m_nValue = nNewValue;
}
Sur Apprendre le C++, ils ont dit qu'il irait plus vite. Alors, j'ai pensé qu'il serait idéal pour une utilisation sur les getters et les setters. Mais peut-être, il ya quelques inconvénients à cela?
- Merci à tous! Conclusion générale: ne le faites pas, le compilateur va prendre soin d'elle.
- Il dépend. Si vous les avez dans la définition de la classe, il n'est pas nécessaire de l'inclure, car ils le sont déjà par défaut. Si vous faites la mise en œuvre dans un autre .fichier cpp, alors il est à l'éditeur de liens, ce qui peut être intelligent comme sur la célèbre plates-formes ou tout simplement un muet de l'éditeur de liens qui ne sont pas inline rien à moins de connaître les quais autant que je sache.
- Permettez-moi d'ajouter quelques mots à la réponse que j'ai donné ci-dessous. Personnellement, je n'aime pas le désordre de ma déclaration de classe avec le code que je considère cette partie de la (technique) de la documentation. Même argument pour la définition de la méthode dans le fichier d'en-tête, mais pas aussi mauvais. Ah et enfin: Vous avez vraiment besoin getters et setters? 🙂
- Je suis d'accord, les accesseurs et mutateurs est rarement une partie de la bonne pratique.
- en fait, c'est surtout les poseurs qui sont d'une mauvaise pratique.
- Une lecture peut-être pas une mauvaise pratique (bien que je serais favorable à pousser au lieu de tirer), d'autre part l'obtention de l'état de l'objet est une violation de l'encapsulation, qui est dans la plupart des cas de mauvaise pratique.
- exposer seulement un getter n'est pas une violation de l'encapsulation, il ne vous oblige à maintenir l'accès à la donnée dans le cadre de votre interface publique. Du point de vue du client, il n'y a aucun moyen de savoir si l'objet possède la valeur ou n'a accès (éventuellement par l'intermédiaire d'un autre objet). En outre, à la suite de votre argument, une extraction des informations à partir de l'objet est une violation de encapsultion.
Vous devez vous connecter pour publier un commentaire.
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 la
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.Si vous écrivez à l'intérieur de 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 (depuis définitions de classe eux-mêmes apparaissent généralement dans plusieurs unités de compilation), pas qu'ils être inline.
inline
si elles sont définies dans la définition de la classe, qui est presque entièrement sans rapport avec le compilateur/linker une fonction inline.C'est une Mauvaise pratique dans les API de Tout changement de ces fonctions nécessite la recompilation de tous les clients.
En général avoir des getters et setters montre des pauvres de l'abstraction, de ne pas le faire.
Si vous êtes constamment les données brutes dans une autre classe, alors vous avez probablement besoin de ré organiser vos classes, au lieu de considérer la façon dont vous souhaitez manipuler les données à l'intérieur d'une classe et de fournir des méthodes pour le faire.
Points négatifs:
Le compilateur est libre à vous ignorer.
Tout changement de ces fonctions nécessite la recompilation de tous les clients.
Un bon compilateur inline non-inline fonctions de toute façon, quand c'est approprié.
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.
Essayer 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 ;))
Un des lieux classiques de gens aiment à en ligne (au moins dans les jeux vidéo, qui est d'où je suis originaire), est 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
Le code compile un peu plus longtemps et vous perdez de l'encapsulation. Tout dépend de la taille du projet et de sa nature. Dans la plupart des cas, il est OK pour faire inline si ils n'ont pas une logique complexe.
BTW, vous pouvez sauter
inline
si vous mettez en œuvre directement dans la définition de la classe.En mettant le code dans l'en-tête, vous exposez votre classe interne fonctionnement. Les Clients peuvent voir et de faire des hypothèses sur la façon dont votre classe fonctionne. Cela peut rendre plus difficile de changer votre classe, plus tard, sans casser le code du client.
Je dirais que vous n'avez pas besoin de s'embêter avec ça. Lire la Section FAQ sur inline.
Pas nécessaire, commencer à avoir confiance les compilateurs, au moins pour ces optimisations!
"Mais pas toujours"
Le mot-clé inline est dénuée de sens dans votre cas
Compilateur inline votre fonction si elle peut et veut, indépendamment de mot-clé.
Le mot-clé inline affecte de liaison et de ne pas l'in-lining. C'est un peu déroutant, mais la lire.
Si la définition est dans une autre unité de compilation (fichier source après préprocesseur, essentiellement) que de l'appel, d'inlining ne sera possible que si l'ensemble du projet de l'optimisation et de la liaison de génération de code sont activés. Permettant il augmente considérablement les temps de lien (depuis pratiquement re-compile tout dans l'éditeur de liens), mais, évidemment, peut améliorer les performances. Vous ne savez pas si il est activé ou désactivé par défaut de GCC et VS.
Je dois dire que je n'ai pas la forte aversion pour cette pratique que d'autres sur ce fil semble avoir. Je suis d'accord que le gain de performance de l'in-lining est négligeable dans tous les, mais le plus largement utilisé de cas. (Et oui, je ont rencontré de tels cas dans la pratique.) Lorsque je fais ce genre de l'in-lining, je le fais pour des raisons de commodité, et en général seulement pour les one-liners comme ça. Dans la plupart de mon cas d'utilisation, de la nécessité d'éviter la recompilation sur le côté client si jamais je les changer n'est tout simplement pas fort.
Oui, vous pouvez déposer de l'
inline
, comme il est implicite par le placement de la mise en œuvre.Aussi, je suis un peu surpris de la véhémence contre les accesseurs. Vous pouvez à peine éternuer à une classe dans tout langage OO, sans souffler un peu en bas, et ils ne sont après tout une technique valable pour résumé la mise en œuvre de l'interface, donc c'est un peu masochiste pour réclamer eux aussi mauvais OO pratique. Il est de bons conseils pour ne pas écrire de accesseurs tort et à travers, mais je vous conseille de ne pas se laisser emporter dans le zèle pour les éradiquer.
Prendre que, puristes. 🙂