82 votes

c++ la fonction inline?

Pourquoi devrais-je faire quelque chose comme ceci:

inline double square (double x) { return x*x;}

au lieu de

double square (double x) { return x*x;}

Est-il une différence?

94voto

Greg Hewgill Points 356191

L'ancien (à l'aide d' inline) permet de mettre cette fonction dans un fichier d'en-tête, où il peut être inclus dans plusieurs fichiers source. À l'aide de inline rend l'identifiant dans le fichier de la portée, à l'instar de déclarer static. Sans l'aide d' inline, vous obtenez un multiple définition d'un symbole d'erreur de l'éditeur de liens.

Bien sûr, c'est en plus de l'astuce pour le compilateur que la fonction doit être compilé inline où il est utilisé (en évitant un appel de fonction, les frais généraux). Le compilateur n'est pas nécessaire d'agir sur l' inline de l'indice.

31voto

Ben Jackson Points 28358

Sur un compilateur moderne il n'y a probablement pas beaucoup de différence. Il peut être incorporé sans l' inline et il peut ne pas être incorporé à l' inline.

27voto

Erik Nedwidek Points 3645

Oui il y a une différence. http://www.parashift.com/c++-faq-lite/inline-fonctions.html#faq-9.1.

Lorsque vous spécifiez qu'une fonction inline, vous en êtes la cause, le compilateur de mettre le code de la méthode dans l'endroit où il est appelé.

void myfunc() {
  square(2);
}

est identique à

void myfunc() {
   2 * 2;
}

L'appel d'une fonction qui est bon pour le code de la clarté, mais lorsque cette fonction est appelée l'état local doit être poussé à la pile, un nouveau local de l'état de la configuration, de la méthode, et quand c'est fait à l'état antérieur doit être sauté. C'est beaucoup de frais généraux.

Maintenant, si vous votre niveau d'optimisation, le compilateur va prendre des décisions comme déroulage de boucles ou l'in-lining fonctions. Le compilateur est libre d'ignorer la ligne de déclaration.

6voto

user3578809 Points 38

De Wikipedia: fonction Inline est une fonction sur laquelle le compilateur a été demandé d'effectuer inline expansion. En d'autres termes, le programmeur a demandé que le compilateur insérer le corps de la fonction dans chaque endroit que la fonction est appelée, plutôt que de générer du code pour appeler la fonction dans le seul endroit où il est défini. Les compilateurs ne sont pas tenus de respecter cette demande.

http://en.wikipedia.org/wiki/Inline_function

2voto

Gio Borje Points 2615

inline fonctionne bien avec le concept de la procédure d'abstraction:

inline double square (double x) { return x*x;}

int squareTwice(double x) {
    double first = square(x);
    double second = square(x);
    return first * second; 
}

Le ci-dessus est fondamentalement semblable à la suivante:

int squareTwice(double x) {
    double first = x*x;
    double second = x*x;
    return first * second; 
}

Cela arrive parce que quand le compilateur-cylindres en ligne développe un appel de fonction, le code de fonction est insérée dans l'appelant flux de code; par conséquent, il peut être plus facile sur le plan procédural résumé le deuxième exemple pour le premier exemple.

Procédure d'abstraction permet de briser une routine en plus petits sous-programmes qui sont beaucoup plus facile à lire (même si cela peut être un choix de style).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X