web-dev-qa-db-fra.com

membres de la fonction inline à l'intérieur d'une classe

Je sais que déclarer une fonction (fonction normale et non une méthode à l'intérieur d'une classe) comme étant en ligne est une bonne pratique lorsque la définition de la fonction est petite pour les performances et permet de gagner du temps pour la compilation. Mais qu'en est-il des méthodes en ligne dans une classe? Je ne comprends pas le concept des méthodes en ligne dans une classe? Comment les définir et comment ils fonctionnent.

48
AlexDan

mais qu'en est-il des méthodes en ligne à l'intérieur d'une classe?

Les deux syntaxes pour les fonctions en ligne (en utilisant explicitement inline et en définissant la fonction membre dans la définition de classe) ne fournissent que des conseils sur la ligne pour le compilateur. Du point de vue performance, ils sont égaux.

En cas de définition d'une fonction membre dans une déclaration de classe, la lisibilité de cette dernière devrait être votre principale préoccupation: cela fait vraiment mal de jeter une interface sur la classe avec plusieurs lignes de détails d'implémentation. Évitez donc de le faire si votre fonction membre est composée de plusieurs instructions: return stuff ou le transfert simple devrait être OK, mais généralement pas plus que cela.

class MyClass
{
public:
    int f() const { return m_i; }
    int g() const;

private:
    int m_i;
};

inline int MyClass::g() const
{
    return m_i;
}

// both member-functions behave equally (except for naming)
56
Alexander Poluektov

La spécification d'une fonction/procédure comme inline à l'intérieur d'une classe indique au compilateur qu'au lieu de créer du code pour appeler la fonction et transmettre des paramètres, le contenu de la fonction doit être placé au point d'appel.

Il peut améliorer les performances du binaire compilé lorsqu'il devient plus efficace d'exécuter la fonction sans avoir à passer de paramètres. Cela peut également nuire aux performances, car la répétition du code qui aurait été dans la fonction à chaque emplacement d'appel peut provoquer un ballonnement qui diminue la probabilité que votre code se trouve dans une mémoire cache plus rapide.

21
John

Il y a deux options à proposer au compilateur pour rendre une fonction de classe en ligne:

(1) Définition d'une fonction dans la déclaration de la classe (dans un fichier d'en-tête)

class Human {

public:

    Human(const char* name);
    Human();

    // is implicit inline
    void lookAt(const char* name) const {
        std::cout << "I'm looking at " << name << std::endl;

    }

private:
    char _name[30]; 

}; 

(2) Utilisation explicite du mot-clé inline dans la définition de la fonction (dans un fichier d'en-tête)

    // is explicit inline 
    inline void lookAt(const char* name) const {
        std::cout << "I'm looking at " << name << std::endl;

    }
18
Jan Koester