C++
Fonctions en ligne
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.