Pourquoi devrais-je faire quelque chose comme ça:
inline double square (double x) { return x*x;}
au lieu de
double square (double x) { return x*x;}
Y a-t-il une différence?
Le premier (en utilisant inline
) vous permet de placer cette fonction dans un fichier d'en-tête, où elle peut être incluse dans plusieurs fichiers source. Utiliser inline
fait l'identifiant dans portée du fichier, un peu comme le déclarer static
. Sans utiliser inline
, vous obtiendriez une erreur de définition de symboles multiples de l'éditeur de liens.
Bien sûr, ceci est en plus de l'indication au compilateur que la fonction doit être compilée en ligne dans où elle est utilisée (en évitant une surcharge d'appel de fonction). Le compilateur n'est pas obligé d'agir sur l'indice inline
.
Oui, il y a une différence. https://isocpp.org/wiki/faq/inline-functions .
Lorsque vous spécifiez qu'une fonction est en ligne, vous amenez le compilateur à placer le code de la méthode là où elle est appelée.
void myfunc() {
square(2);
}
est identique à
void myfunc() {
2 * 2;
}
L'appel d'une fonction est bon pour la clarté du code, mais lorsque cette fonction est appelée, l'état local doit être poussé vers la pile, un nouvel état local est configuré pour la méthode, et lorsqu'il est fait, l'état précédent doit être sauté. C'est beaucoup de frais généraux.
Maintenant, si vous augmentez votre niveau d'optimisation, le compilateur prendra des décisions telles que le déroulement des boucles ou les fonctions en ligne. Le compilateur est toujours libre d'ignorer l'instruction inline.
Sur un compilateur moderne, il n'y a probablement pas beaucoup de différence. Il peut être inséré sans le inline
et il peut pas être inséré avec le inline
.
De Wikipedia: La fonction inline est une fonction sur laquelle le compilateur a été invité à effectuer une expansion inline. En d'autres termes, le programmeur a demandé au compilateur d'insérer le corps complet de la fonction à chaque endroit où la fonction est appelée, plutôt que de générer du code pour appeler la fonction au seul endroit où elle est définie. Les compilateurs ne sont pas tenus de respecter cette demande.
La fonction inline, si le compilateur se conforme, inclura la fonction inline dans le code dans lequel elle a été appelée comme si aucune fonction n'était appelée (comme si vous aviez mis la logique dans la fonction appelante) et éviterait la surcharge d'appel de la fonction.
inline
fonctionne bien avec le concept de abstraction procédurale:
inline double square (double x) { return x*x;}
int squareTwice(double x) {
double first = square(x);
double second = square(x);
return first * second;
}
Ce qui précède est fondamentalement similaire à ce qui suit:
int squareTwice(double x) {
double first = x*x;
double second = x*x;
return first * second;
}
Cela se produit car lorsque le compilateur développe en ligne un appel de fonction, le code de la fonction est inséré dans le flux de code de l'appelant; par conséquent, il peut être plus facile d'abstraire procéduralement le deuxième exemple au premier exemple.
L'abstraction procédurale permet de diviser une routine en sous-programmes plus petits qui sont beaucoup plus faciles à lire (bien que cela puisse être un choix de style).