68 votes

En C++, le constructeur et le destructeur peuvent-ils être des fonctions en ligne ?

VC++ fait des fonctions qui sont implémentées dans la déclaration de classe des fonctions inline.

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

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

{
    Foo f;
    (f);
}

65voto

James Devlin Points 6699

Définir le corps du constructeur à l'intérieur de la classe a le même effet que de placer la fonction à l'extérieur de 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 inline. Cela dépend de la complexité de la fonction et d'autres règles.

29voto

Wilka Points 13239

La réponse 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 auriez également pu faire :

class Foo 
{
    int* p;
public:
    Foo();
    ~Foo();
};

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
}

inline Foo::~Foo()
{ 
    delete [] p; 
}

Cependant, c'est au compilateur de décider s'il met effectivement la fonction en ligne. VC++ ignore à peu près tout de vos demandes de mise en ligne. Il ne mettra en ligne une fonction que s'il pense que c'est une bonne idée. Les versions récentes du compilateur mettront également en ligne des éléments qui se trouvent dans des fichiers .obj séparés et qui ne sont pas déclarés en ligne (par exemple, du code dans différents fichiers .cpp) si vous utilisez génération du code temporel de la liaison .

Vous pourriez utiliser le __forceinline pour indiquer au compilateur que vous êtes vraiment sérieux lorsque vous dites "inline cette fonction", mais cela ne vaut généralement pas la peine. Dans de nombreux cas, le compilateur est vraiment le mieux placé pour savoir.

4voto

Mickey Points 514

Placer la définition de la fonction dans le corps de la classe équivaut à marquer une fonction avec le mot clé inline. Cela signifie que la fonction peut ou non être inline par le compilateur. Je suppose donc que la meilleure réponse serait "peut-être" ?

2voto

DrPizza Points 9355

Dans la même mesure que nous pouvons rendre n'importe quelle autre fonction inline, oui.

2voto

rschuler Points 1169

La décision de mettre en ligne ou non est principalement prise par votre compilateur. L'inline dans le code n'est qu'une indication pour le compilateur.
Une règle sur laquelle vous pouvez compter est que les fonctions virtuelles ne seront jamais inlined. Si votre classe de base a un constructeur/destructeur virtuel, la vôtre ne sera probablement jamais inlined.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X