2010-05-18 14 views
2

Depuis boost::shared_ptr pourrait être appelé très fréquemment et renvoie simplement un pointeur, n'est pas l'opérateur -> un bon candidat pour être inlined?Pourquoi l'opérateur boost :: shared_ptr -> n'est-il pas déclaré inline?

T * operator->() const // never throws 
{ 
    BOOST_ASSERT(px != 0); 
    return px; 
} 

Est-ce qu'un bon compilateur automatiquement inline cela de toute façon?

Est-ce que je devrais perdre le sommeil au-dessus de ceci? :-)

+0

De nos jours, un bon compilateur d'optimisation fera un meilleur travail que vous de décider ce qui doit être en ligne, donc ignorera le mot-clé 'inline'. –

+0

@Blue: Ignorez la partie inline, de toute façon. Mais vous avez raison: les compilateurs intègrent complètement le mot-clé 'inline'. Aucune des fonctions 'inline' et' inline''d ne peut être inline. – GManNickG

+0

@ BlueRaja-DannyPflughoeft, @GMan: vous êtes trop généraliser un peu. Si vous ne pouvez pas vous permettre de compiler avec l'optimisation complète activée (pour quelque raison que ce soit), vous voudrez peut-être contrôler quelles fonctions doivent être intégrées ou non. Alors "inline" devient moins pertinent. Je ne suis pas un expert, mais je suppose que c'est l'une des raisons pour lesquelles le mot-clé existe. –

Répondre

4

Est-ce qu'un bon compilateur l'alignerait automatiquement de toute façon?

Très probablement, oui, ce serait le cas.

Est-ce que je devrais perdre le sommeil au-dessus de ceci?

Mieux vaut pas. Si vous voulez être super-sûr (ou vous êtes super curieux), vérifiez l'assemblage qui sort de votre compilateur.

18

Les fonctions définies (c'est-à-dire avec un corps) à l'intérieur d'une classe sont implicitement candidates à l'inlining. Il n'est pas nécessaire d'utiliser le mot-clé inline dans ces cas, et il est inhabituel de le faire.

1

S'il vous plaît noter que shared_ptr est un modèle de classe , de sorte que ses fonctions membres sont en fait modèles de fonction.

Puisqu'ils ne sont pas export ed, ils doivent non seulement être déclaré, mais aussi définis dans toutes les unités de traduction où ils sont utilisés, comme une fonction définie avec le prescripteur de stockage inline.

D'une certaine manière, template signifie également inline.