membres de fonction en ligne dans une classe

Je sais que déclarer une fonction (fonction normale pas une méthode dans une classe) comme inline est une bonne pratique lorsque la définition de la fonction est petite pour la performance et cela permet de gagner du temps pour la compilation. Mais que diriez-vous des méthodes en ligne dans une classe Je ne comprends pas le concept de méthodes en ligne dans une classe? Comment les définir et comment ils fonctionnent.

42
demandé sur Benjamin 2012-02-21 04:31:35

3 réponses

Mais Que diriez-vous des méthodes en ligne dans une classe ?

Les deux syntaxes pour les fonctions d'inline (en utilisant inline explicite et en définissant la fonction membre dans la définition de la classe) ne fournissent que des indications sur l'inline 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 de votre préoccupation principale: Cela fait vraiment mal de jeter une interface de classe avec plusieurs lignes de détails de mise en œuvre. Donc, évitez de le faire si votre fonction membre est plus d'une instruction: return stuff ou simple forwarding 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)
45
répondu Alexander Poluektov 2015-08-19 11:40:43

Spécifier une fonction/procédure comme inline dans une classe laisse entendre au compilateur qu'au lieu de créer du code pour appeler la fonction et passer les 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 répéter le code qui aurait été dans la fonction à chaque fois l'emplacement de l'appel peut provoquer un gonflement qui diminue la probabilité que votre code soit trouvé dans une mémoire cache plus rapide.

16
répondu John 2012-02-21 00:38:18

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

(1) si vous définissez 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) Utilisez le mot-clé inline explicite 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;

    }
16
répondu Jan Koester 2012-02-21 01:22:24