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.
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.
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.
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.