63 votes

Ecriture de la définition de fonction dans les fichiers d'en-tête en C ++

J'ai une classe qui a de nombreuses petites fonctions. Par de petites fonctions, je veux dire des fonctions qui ne fait pas de traitement, mais il suffit de retourner une valeur littérale. Quelque chose comme

string Foo::method() const{
    return "A";
}

J'ai créé un fichier d'en-tête "Foo.h" et le fichier source "Foo.cpp". Mais puisque la fonction est très petit, je pense à le mettre dans le fichier d'en-tête lui-même. J'ai les questions suivantes

  1. Est-il des performances ou à d'autres questions si j'ai mis ces définition de la fonction dans le fichier d'en-tête? Je vais avoir beaucoup de fonctions de ce genre.
  2. Ma compréhension est lors de la compilation, le compilateur va développez le fichier d'en-tête et le lieu où il est inclus. Est-ce exact?

69voto

Johannes Schaub - litb Points 256113

Si la fonction est de petite taille (la chance que c'est souvent faible), et si la fonction peut être mis dans la tête, sans y compris des myriades d'autres en-têtes (parce que votre fonction dépend d'eux), il est parfaitement valable de le faire. Si vous les déclarez extern inline, alors le compilateur est nécessaire pour lui donner la même adresse à chaque unité de compilation:

headera.h:

inline string method() {
    return something;
}

Les fonctions de membres sont implicites inline fournies qu'ils sont définis à l'intérieur de leur classe. La même chose est vrai pour les leur vraie: Si, ils peuvent être mis dans la tête, sans tracas, vous pouvez le faire en effet.

Parce que le code de la fonction est de mettre dans l'en-tête et le visible, le compilateur est capable de inline appels à eux, c'est de mettre le code de la fonction directement sur le site d'appel (pas tellement parce que vous mettez inline avant, mais plus parce que le compilateur décide de cette façon, si. Mettre inline est seulement une indication pour le compilateur concernant l'). Qui peut en résulter une amélioration de la performance, parce que le compilateur voit maintenant où les arguments correspondent à des variables locales à la fonction, et où l'argument n'est pas alias uns les autres, et le dernier mais non le moins, la fonction de cadre de l'allocation n'est plus nécessaire.

Ma compréhension est lors de la compilation, le compilateur va développez le fichier d'en-tête et le lieu où il est inclus. Est-ce exact?

Oui, c'est correct. La fonction sera définie dans chaque endroit où vous inclure son en-tête. Le compilateur se soucient de mettre une seule occurrence dans le programme résultant, en éliminant les autres.

12voto

Ferruccio Points 51508

En fonction de votre compilateur et ses paramètres, il peut effectuer les opérations suivantes:

  • Il peut ignorer le mot-clé inline (il est juste une indication pour le compilateur, pas un de commande) et de générer des stand-alone fonctions. Il peut le faire si votre les fonctions de dépasser un compilateur-dépendante seuil de complexité. par exemple, de trop nombreuses boucles imbriquées.
  • Il peut décider que votre stand-alone la fonction est un bon candidat pour inline expansion.

Dans de nombreux cas, le compilateur est dans une bien meilleure position pour déterminer si une fonction doit être insérée que vous êtes, alors il n'y a pas de point dans le deuxième deviner. J'aime utiliser implicite inline lorsqu'une classe a de nombreuses petites fonctions seulement parce que c'est pratique d'avoir la mise en œuvre dans la classe. Cela ne fonctionne pas si bien pour les grands événements.

L'autre chose à garder à l'esprit est que si vous exportez une classe dans une DLL ou une bibliothèque partagée (pas une bonne idée à mon humble avis, mais les gens font de toute façon), vous devez être très prudent avec les fonctions inline. Si le compilateur qui a construit la DLL décide une fonction inline vous avez un couple de problèmes potentiels:

  1. Le compilateur compiler le programme à l'aide de la DLL peut décider de ne pas inline la fonction de sorte qu'il sera générer un symbole de référence pour une fonction qui n'existe pas et le DLL ne se charge pas.
  2. Si vous mettez à jour la DLL et le changement fonction inline, le programme client va toujours utiliser l'ancienne version de cette fonction puisque la fonction suis incorporé dans le code client.

4voto

Qubeuc Points 334

Les performances vont augmenter car l'implémentation dans les fichiers d'en-tête est implicitement intégrée. Comme vous l'avez dit, vos fonctions sont petites, le fonctionnement en ligne sera donc bénéfique pour vous, à mon humble avis.

Ce que vous dites à propos du compilateur est également vrai. Il n'y a pas de différence entre le code du fichier d'en-tête et celui du fichier .cpp .

2voto

sykora Points 30290
<ol> <li><p>Si vos fonctions sont aussi simple que cela, rendre inline, et vous devrez de toute façon les coller dans le fichier d’en-tête. Other than that, les conventions sont juste que - conventions.</p></li> <li><p>Oui, le compilateur développe le fichier d’en-tête où il rencontre les instructions #include.</p></li> </ol>

0voto

Naveen Points 37095

Vous devriez utiliser des fonctions inline. Lisez ces fonctions en ligne pour une meilleure compréhension et les compromis impliqués.

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