web-dev-qa-db-fra.com

Modèle C ++ et en ligne

Lorsque j'écris une classe simple (non modèle), si l'implémentation de la fonction est fournie "juste en place", elle est automatiquement traitée comme inline.

class A {
   void InlinedFunction() { int a = 0; }
   // ^^^^ the same as 'inline void InlinedFunction'
}

Qu'en est-il de cette règle lorsque l'on parle de classes basées sur des modèles?

template <typename T> class B {
   void DontKnowFunction() { T a = 0; }
   // Will this function be treated as inline when the compiler
   // instantiates the template?
};

De plus, comment la règle inline est-elle appliquée aux fonctions de modèle non imbriquées, comme

template <typename T> void B::DontKnowFunction() { T a = 0; }

template <typename T> inline void B::DontKnowFunction() { T a = 0; }

Que se passerait-il dans le premier et dans le deuxième cas ici?

Je vous remercie.

37
Yippie-Ki-Yay

Pour autant que je sache, les fonctions modèles sont automatiquement intégrées. Cependant, la réalité est que la plupart des compilateurs modernes ignorent régulièrement le qualificatif en ligne. L'heuristique d'optimisation du compilateur fera très probablement un bien meilleur choix des fonctions à intégrer qu'un programmeur humain.

1
Puppy

Puisque lorsque vous instanciez vous obtenez une classe, cette fonction est comme une fonction membre ordinaire. Il est défini dans cette classe, donc la fonction est automatiquement en ligne.

Mais cela n'a pas vraiment d'importance ici. De toute façon, vous pouvez définir des modèles de fonction ou des membres de modèles de classe dans un programme - vous n'avez pas besoin de inline pour en informer le compilateur comme dans le cas non-modèle.

13

Le mot clé en ligne n'est pas une "règle". C'est simplement une suggestion/astuce pour le compilateur et ce qu'il en fait dépend entièrement de lui et de sa mise en œuvre. Dans cet esprit, il n'est pas possible de savoir ce qui se passera avec vos exemples. Le compilateur peut en fait en ligne tous, certains ou aucun d'entre eux.

1
RC.