IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Intérêt de inline


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    304
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2006
    Messages : 304
    Par défaut Intérêt de inline
    bonjour, quelle est l'utilité de la fonction inline !

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Par défaut
    Hum hum hum,

    les faq sont aussi la pour etre lu

    http://c.developpez.com/faq/cpp/?page=inline

    Et si jamais tu trouve pas dans la FAQ, utilise le moteur de recherche
    http://c.developpez.com/faq/cpp/?rechercher=inline

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Par défaut reponse
    l'interet c'est de gagner du temps...


    En C++, on gagne beaucoup à écrire une fonction « en ligne » (inline).Par exemple Il suffit d’écrire :

    inline int max(int a, int b)
    {
    if (a < b) return b; else return a;
    }
    Dans ce cas, le compilateur sait que chaque occurrence de l’appel de max devra être remplacée par le code de celle-ci.

    mais une simple recherche t'aurais permis de le trouver rapidement.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    La réponse courte tiens en deux mot: tres limité...

    Pour la réponse longue, il faut commencer par une petite explication:

    Tout part du constat que l'appel d'un fonction, au niveau du processeur, ca prend un temps bête(comprenons-nous... En temps processeur, 7 ou 8 fréquence d'horloge, c'est long, meme si ca ne fait que quelques nano secondes )

    Quand on crée une très petite fonction (je penses, entre autres, aux méthodes Get des classes) ou que l'on appelle très souvent une fonction, l'adage qui dit que ce sont les petits ruisseaux qui font les grand fleuve reste tout à fait vrai ...

    L'idée du mot clé inline est donc de demander au compilateur, quand il rencontre la fonction, de remplacer l'appel de la fonction par le code qu'elle contient...

    L'avantage, c'est que cela créera un exécutable plus rapide (du fait des sauts évités), mais aussi... plus lourd (vu que l'on trouvera peut etre 500 fois exactement les memes instructions... alors qu'on ne les aurait trouvées qu'une seule fois sans "l'inlining")

    Du moins, si tout se passait comme la théorie le voudrait:

    En effet, il y a des fonctions que le compilateur ne saura jamais "inliner" (je pense tout particulièrement aux fonctions récursives), et, pire encore, ce n'est pas parce que tu demandes au compilateur de créer une fonction inline qu'il le fera d'office, car il reste "seul juge" de la décision finale

    A tel point qu'il est meme possible que le compilateur décide d'inliner certains appel à une fonction donnée, mais d'en gérer d'autres de manière tout à fait classique, et qu'il est possible que cette décision puisse engendrer certains problème au sein de l'exécutable (meme si j'ignore tout à fait les problèmes que ca peut engendrer )

    Bref, tout cela pour dire que, effectivement, l'intérêt du mot clé inline est très limité, et qu'il ne faut pas *forcément* compter dessus pour fournir un code *réellement* beaucoup plus rapide...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Citation Envoyé par koala01
    L'avantage, c'est que cela créera un exécutable plus rapide (du fait des sauts évités), mais aussi... plus lourd (vu que l'on trouvera peut etre 500 fois exactement les memes instructions... alors qu'on ne les aurait trouvées qu'une seule fois sans "l'inlining")
    Sauf si la traduction assembleur de ta fonction prend autant d'instructions ou moins qu'un appel de fonctions.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par bolhrak
    Sauf si la traduction assembleur de ta fonction prend autant d'instructions ou moins qu'un appel de fonctions.
    Ca, c'est vraiment l'exception qui confirme la regle et qui arrive, finalement très rarement...

    Parce que, en y réfléchissant, une fonction, au niveau du processeur c'est

    • L'appel de la fonction (CALL <adresse> en assembleur si mes souvenirs sont bons)
    • les instructions de la fonction (immuable)
    • la reprise de l'exécution normale (dans la fonction, l'équivalent au return, dont j'ai oublié le terme en assembleur)


    Il n'y ara donc que dans le cas ou la fonction peut etre traduite par une ou deux instructions processeur unique (charger un accu, ou similaire) que tu te retrouveras effectivement avec un code plus léger...

    Au dela de deux instructions, l'exécutable sera, au mieux d'un poids égal, et, vraissemblablement plus lourd (le gain de quelques fréquences d'horloge se traduit, de manière quasi systématique, et pour autant que l'algorithme de base soit efficace, par une augmentation du nombre d'instructions à effectuer )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    4 instructions assembleur (de mémoire) pour les appels de fonctions ou fonctions membres non virtuelles; du coup ce n'est plus si anodin que ça, notamment pour les getters/setters, ou les appels chainés de fonction, genre une fonction A qui se contente d'appeler une fonction B.

    Mais bon c'est clair que ce n'est pas non plus la majorité des cas, c'était plus par amour de la discussion

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Ça dépend des machines...

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Vous oubliez l'empilement des paramètres, l'allocation sur la pile des variables locales à la fonction (frame pointer)...

    À moins d'avoir une fonction "nue", l'appel peut être plus lourd qu'on le pense...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Médinoc
    Vous oubliez l'empilement des paramètres, l'allocation sur la pile des variables locales à la fonction (frame pointer)...

    À moins d'avoir une fonction "nue", l'appel peut être plus lourd qu'on le pense...
    De fait...

    Mais, à moins de "s'amuser" à passer des parametres inutiles, il est fort probables que la multiplication des parametres aille de pair avec celle de ce que doit faire la fonction pour fournir son résultat...

    Si l'on peut ergoter sur la limite d'instructions processeur en-dessous de laquelle une fonction inline fournira un exécutable plus léger que la meme fonction appelée de manière "traditionnelle" et au dela de laquelle la fonction inline fournira un exécutable plus lourd, et donc, par conséquent, sur la différence de poids de l'exécutable final, il n'en reste que la différence de poids tendra le plus souvent à allourdir la version inlinee...

    Nous sommes confrontés au meme phénomene que celui qui apparait lorsqu'on "déroule" l'exécution d'une boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(i=0;i<x;i++)
       cout<<i;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cout<<0;
    cout<<1;
    cout<<2;
    ...
    cout<<x-1;
    fourniront le meme résultat...

    la différence viendra de ce que la première version sera un peu plus lente -quelques nano secondes au pire, vu les processeurs actuels(du fait de la présence de saut pour la boucle) à moins d'avoir un x particulièrement élevé- et que, si, dans la première version, on se retrouve avec un nombre équivalent à T1=I+J d'instructions processeur (où T est le total, I, le nombre d'instructions nécessaire à l'initialisation de la boucle et J le nombre d'instructions pour provoquer l'affichage), nous nous retrouverons dans la seconde version avec un nombre total équivalant à T2=J*x...

    De fait, la premiere version pourra etre plus lourde que la seconde, mais si et seulement si T2 est plus petit que T1 pour un résultat équivalent, ce qui ne pourra arriver que pour un x d'autant plus bas que I est peu élevé... autrement dit de manière plutot anecdotique
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par koala01
    Ca, c'est vraiment l'exception qui confirme la regle et qui arrive, finalement très rarement...
    Il y a un autre cas d'exception, c'est si la fonction n'est appelée que depuis un seul point dans le programme.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Intérêt de "inline" de nos jours : pour ou contre ?
    Par Aurelien.Regat-Barrel dans le forum Langage
    Réponses: 93
    Dernier message: 24/03/2010, 21h04
  2. [Turbo C++] Fonciton containing for are not expanded inline
    Par BuG dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 17/02/2003, 06h48
  3. Quel est l'intérêt des Services Web ??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 19
    Dernier message: 12/02/2003, 22h28
  4. [Concept] BD ou Gestion par fichier. Intérêt de la BD ?
    Par Cian dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/11/2002, 12h16
  5. [Technique] Intérêt des index
    Par ddams dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 04/11/2002, 15h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo