En C ++, le constructeur et le destructeur peuvent-ils être des fonctions intégrées?

VC ++ rend les fonctions implémentées dans les fonctions de déclaration de classe en ligne.

Si je déclare une classe Foo comme suit, alors les fonctions en ligne CONSTRUCTOR et DESTRUCTOR sont-elles?

 class Foo { int* p; public: Foo() { p = new char[0x00100000]; } ~Foo() { delete [] p; } }; { Foo f; (f); } 

Définir le corps du constructeur INSIDE de la classe a le même effet en plaçant la fonction OUTSIDE dans la classe avec le mot-clé “inline”.

Dans les deux cas, c’est un indice pour le compilateur. Une fonction “inline” ne signifie pas nécessairement que la fonction sera intégrée. Cela dépend de la complexité de la fonction et des autres règles.

La reponse courte est oui. Toute fonction peut être déclarée en ligne, et mettre le corps de la fonction dans la définition de la classe est une façon de le faire. Vous pourriez aussi avoir fait:

 class Foo { int* p; public: Foo(); ~Foo(); }; inline Foo::Foo() { p = new char[0x00100000]; } inline Foo::~Foo() { delete [] p; } 

Cependant, il appartient au compilateur s’il intègre réellement la fonction. VC ++ ignore à peu près vos demandes d’inline. Il n’inclut une fonction que si elle pense que c’est une bonne idée. Les versions récentes du compilateur incluront également les éléments contenus dans des fichiers .obj séparés et non déclarés en ligne (par exemple, à partir de code dans différents fichiers .cpp) si vous utilisez la génération de code de temps de lien .

Vous pouvez utiliser le mot-clé __forceinline pour dire au compilateur que vous le pensez vraiment lorsque vous dites “inline this function”, mais cela ne vaut généralement pas la peine. Dans de nombreux cas, le compilateur sait vraiment mieux.

Mettre la définition de la fonction dans le corps de la classe sans équivoque à marquer une fonction avec le mot-clé inline. Cela signifie que la fonction peut ou non être intégrée par le compilateur. Donc je suppose que la meilleure réponse serait “peut-être”?

Dans la même mesure, nous pouvons aligner toute autre fonction, oui.

Inline ou non est principalement décidé par votre compilateur. Inline dans le code n’indique que le compilateur.
Une règle sur laquelle vous pouvez compter est que les fonctions virtuelles ne seront jamais intégrées. Si votre classe de base a un constructeur / destructeur virtuel, le vôtre ne sera probablement jamais intégré.