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

StackOverflow https://stackoverflow.com/questions/21303

  •  09-06-2019
  •  | 
  •  

Question

VC++ crée des fonctions qui sont implémentées dans les fonctions en ligne de déclaration de classe.

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

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

{
    Foo f;
    (f);
}
Était-ce utile?

La solution

Définir le corps du constructeur À L'INTÉRIEUR de la classe a le même effet de placer la fonction À L'EXTÉRIEUR de la classe avec le mot-clé "inline".

Dans les deux cas, c'est une indication pour le compilateur.Une fonction « en ligne » ne signifie pas nécessairement que la fonction sera intégrée.Cela dépend de la complexité de la fonction et d'autres règles.

Autres conseils

La reponse courte est oui.N'importe quelle fonction peut être déclarée en ligne, et placer le corps de la fonction dans la définition de classe est un moyen d'y parvenir.Vous auriez aussi 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 intègre réellement la fonction.VC++ ignore à peu près vos demandes d'inline.Il n'intégrera une fonction que s'il pense que c'est une bonne idée.Les versions récentes du compilateur intégreront également les éléments qui se trouvent dans des fichiers .obj séparés et non déclarés en ligne (par ex.à partir du code dans différents fichiers .cpp) si vous utilisez génération de code temporel de lien.

Vous pourriez utiliser le __forceinline mot-clé pour indiquer au compilateur que vous le pensez vraiment lorsque vous dites "inline cette fonction", mais cela n'en vaut généralement pas la peine.Dans de nombreux cas, c’est le compilateur qui sait le mieux.

Mettre la définition de la fonction dans le corps de la classe équivaut au marquage d'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 où nous pouvons créer n'importe quelle autre fonction en ligne, oui.

L'intégration ou non est principalement décidée par votre compilateur.Inline dans le code ne fait que donner des indications au 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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top