Recherche…


Introduction

Une fonction définie avec le spécificateur en inline est une fonction en ligne. Une fonction en ligne peut être définie de manière multiple sans violer la règle de définition unique et peut donc être définie dans un en-tête avec un lien externe. Déclarer une fonction inline indique au compilateur que la fonction doit être intégrée lors de la génération du code, mais ne fournit aucune garantie.

Syntaxe

  • fonction_déclaration inline
  • inline function_definition
  • classe {définition_fonction};

Remarques

Habituellement, si le code généré pour une fonction est suffisamment petit, c'est un bon candidat pour être intégré. Pourquoi donc Si une fonction est grande et intégrée dans une boucle, pour tous les appels effectués, le code de la grande fonction serait dupliqué, ce qui conduirait à la taille binaire générée. Mais quelle est la taille suffisante?

Bien que les fonctions en ligne semblent être un excellent moyen d’éviter les appels de fonction, il convient de noter que toutes les fonctions marquées en inline sont pas toutes intégrées. En d'autres termes, lorsque vous dites en inline , ce n'est qu'un indice pour le compilateur, pas un ordre: le compilateur n'est pas obligé d'inclure la fonction, il est libre de l'ignorer - la plupart le font. Les compilateurs modernes sont mieux à même de faire de telles optimisations que ce mot-clé est maintenant un vestige du passé, lorsque les compilateurs ont pris cette suggestion au sérieux. Même les fonctions qui ne sont pas marquées en inline sont insérées par le compilateur lorsque cela s'avère avantageux.

Inline comme directive de liaison

L'utilisation plus pratique de l' inline dans le C ++ moderne provient de son utilisation comme directive de liaison. Lors de la définition , et non de la déclaration, d'une fonction dans un en-tête qui sera incluse dans plusieurs sources, chaque unité de traduction aura sa propre copie de cette fonction entraînant une violation ODR (One Definition Rule); Cette règle dit grossièrement qu'il ne peut y avoir qu'une seule définition d'une fonction, d'une variable, etc. Pour contourner cette violation, le marquage de la définition de fonction en inline fait implicitement le lien de fonction interne.

FAQ

Quand dois-je écrire le mot-clé 'inline' pour une fonction / méthode en C ++?

Seulement lorsque vous souhaitez que la fonction soit définie dans un en-tête. Plus exactement lorsque la définition de la fonction peut apparaître dans plusieurs unités de compilation. C'est une bonne idée de définir des fonctions de petite taille (comme dans une ligne) dans le fichier d'en-tête, car cela donne au compilateur plus d'informations pour travailler tout en optimisant votre code. Cela augmente également le temps de compilation.

Quand ne devrais-je pas écrire le mot-clé 'inline' pour une fonction / méthode en C ++?

N'ajoutez pas de inline lorsque vous pensez que votre code s'exécutera plus rapidement si le compilateur l'a intégré.

Quand le compilateur ne saura-t-il pas quand une fonction / méthode doit être intégrée?

Généralement, le compilateur sera en mesure de le faire mieux que vous. Cependant, le compilateur n'a pas la possibilité d'insérer du code s'il ne possède pas la définition de la fonction. Dans le code optimisé au maximum, toutes les méthodes privées sont généralement intégrées, que vous le demandiez ou non.

Voir également

Déclaration de fonction en ligne non membre

inline int add(int x, int y);

Définition de fonction inline non membre

inline int add(int x, int y)
{
    return x + y;
}

Fonctions inline membres

// header (.hpp)    
struct A
{
    void i_am_inlined()
    {
    }
};

struct B
{
    void i_am_NOT_inlined();
};

// source (.cpp)    
void B::i_am_NOT_inlined()
{
}

Qu'est-ce que la fonction inline?

inline int add(int x, int y)
{
    return x + y;
}

int main()
{
    int a = 1, b = 2;
    int c = add(a, b);
}

Dans le code ci-dessus, lorsque l' add est en ligne, le code résultant deviendrait quelque chose comme ça

int main()
{
    int a = 1, b = 2;
    int c = a + b;
}

La fonction inline est introuvable, son corps est inséré dans le corps de l'appelant. Si add n'avait pas été intégré, une fonction serait appelée. La surcharge liée à l'appel d'une fonction, telle que la création d'un nouveau frame de pile , la copie d'arguments, la création de variables locales, le saut (perte de localisation de référence et absence de cache), doit être engagée.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow