2008-11-05 18 views
10

Je cours fréquemment dans de grandes classes non-template en C++ où les méthodes simples sont définies directement dans le corps de la classe dans le fichier d'en-tête au lieu de séparément dans le fichier d'implémentation. Par exemple:Pourquoi les méthodes C++ sont-elles parfois définies dans les classes?

class Foo { 
    int getBar() const { return bar; } 
    ... 
}; 

Pourquoi faire cela? Il semble qu'il y ait des inconvénients. L'implémentation n'est pas aussi cachée qu'elle devrait l'être, le code est moins lisible, et il y aurait aussi une charge accrue sur le compilateur si le fichier d'en-tête de la classe est inclus dans de nombreux endroits différents. Je pense que les gens ont l'intention que ces fonctions soient intégrées dans d'autres modules, ce qui pourrait améliorer considérablement les performances. Cependant, j'ai entendu dire que les plus récents compilateurs peuvent faire des inlining (et d'autres optimisations interprocédurales) au moment de la liaison entre les modules. Quelle est la portée de ce type d'optimisation des liens, et est-ce que cela rend ces définitions inutiles? Y a-t-il d'autres bonnes raisons pour ces définitions?

Répondre

14

La norme C++ indique que les méthodes définies dans la définition de classe sont inline par défaut. Cela entraîne des gains de performance évidents pour les fonctions simplistes telles que les getters et les setters. L'optimisation cross-module de liaison est plus difficile, bien que certains compilateurs puissent le faire.

+1

Oui, mais "inline par défaut" ne signifie pas que le compilateur va les incorporer, seulement que vous n'avez pas à ajouter manuellement le * hint * que le mot-clé "inline" est vraiment. –

2

Vous avez répondu à votre propre question, il s'agit bien de méthodes en ligne.

Les raisons de les utiliser sont la performance.

+0

Néanmoins, cela ne signifie pas que le compilateur les incorporera, mais seulement que vous n'avez pas à ajouter manuellement le * hint * que le mot-clé "inline" est réellement. –

7

Souvent, il n'y a pas d'autre raison que d'être plus simple et de gagner du temps. Il enregistre également un peu d'encombrement dans le fichier d'implémentation, tout en prenant le même nombre de lignes dans le fichier d'en-tête. Et être moins lisible est assez difficile si elle est limitée à des choses comme les getters et les setters.

+0

Pas besoin d'encombrer le fichier source avec du code trivial. –