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 :

pourquoi mettre en inline une fonction get.. ?


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 49
    Points : 21
    Points
    21
    Par défaut pourquoi mettre en inline une fonction get.. ?
    Est ce utile ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si ton accesseur ne fait que renvoyer une variable membre, c'est un peu bête de payer un appel de fonction si la performance est importante. Donc il est fréquent qu'on inline les accesseurs, oui.
    Mais peut-être aussi que tu n'en as pas besoin, dans ce cas mieux vaut éviter de polluer la définition de ta classe avec des corps de fonction.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Pour notre malheur à tous, la réponse que tu attends va prendre une forme de "réponse de normand"

    En effet, toute l'utilité de déclarer une fonction inline dépendra... exclusivement du contexte.

    Il faut, en effet, pour pouvoir comprendre la réponse, déjà savoir ce qui se passe quand tu décide de créer une fonction inline... et, pour bien faire, ce qui se passe quand tu crées une fonction dont tu ne demandes pas qu'elle soit inline.

    Tu le sais sans doute, quand tu crées une fonction qui n'est pas inlinée, le processeur va mettre un certain nombre d'information "sur sa pile" avant d'appeler la fonction que tu as demandée, exécuteras les instructions demandées par la fonction, puis, une fois que la fonction est finie, retournera à l'adresse mémoire qui suit l'appel de la fonction, récupérera les données qu'il avait mis en pile, et continuera son exécution (l'explication n'est pas complete, mais au moins elle donne une bonne idée de ce qui se passe )

    Evidemment, le fait de "sauvegarder" les données pour un usage ultérieur, de sauter à l'adresse mémoire à laquellle se trouve la fonction, puis de re-sauter à l'adresse mémoire qui suit l'appel de la fonction et de récupérer les informations qu'on a "mis de coté", tout cela, ca prend un temp bête ( on se comprend bien: je parle en nombre de fréquence d'horloge nécessaires pour y arriver... avec les processeurs actuels, ca fait quelques micro secondes à peine )

    L'idée est donc de dire au compilateur "je sais que c'est une fonction, mais je voudrais que tu remplaces, dans l'exécutable, tous les appels de cette fonction par les instructions qu'elle contient"...

    L'avantage théorique de déclarer une fonciton inline est donc relativement simple: quand elle est réellement inlinée, il est probable qu'elle soit plus rapide à l'exécution que sa version non inlinée...

    Le hic, parce qu'il y a un hic, c'est que le compilateur peut parfaitement choisir de ne pas remplacer l'appel d'une fonction par ses instructions...

    Le cas "peau de banane" par excellence est celui des fonctions récursives: même si tu le lui demande gentillement, il sera dans l'incapacité totale d'inliner ce genre de fonctions

    Pour les autres, il n'est pas du tout impossible qu'il décide de l'ininer "parfois" mais de la gérer comme une fonction classique, avec tout ce que cela implique, à d'autres moments

    Evidemment, tu ne pourras le remarquer qu'en observant le code assembleur ou le code binaire généré

    Tout cela pour dire que, *théoriquement* tu devrais avoir un leger avantage à déclarer les accesseurs en tant que fonctions inline... mais, cet avantage peut très bien ne rester que théorique...

  4. #4
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Inliner une fonction est une bonne chose d'un point de vue de la performance, modulo l'utilisation du cache.
    Cela permet non seulement d'éviter le code d'appel de la fonction mais en plus cela permet d'adapter la fonction au contexte dans lequel elle est appelée, la rendant plus performante que dans le cas générique.
    Aussi, si par exemple pour appeler une fonction qui prend en paramètre des références il faut poser des pointeurs vers les objets sur la pile, aucune opération n'est nécessaire lors de l'inlining.

    Néanmoins, cela alourdit évidemment la taille de l'exécutable, puisque le code est dupliqué.
    C'est cependant relativement peu souvent un problème.

    Quoi qu'il en soit, pour une fonction qui se résume à très peu d'instructions, inliner est forcément bénéfique puisqu'on gagne en performance, sans gaspiller de taille de code, et sans contre-optimisation éventuelle à cause du cache.

    Il est important de savoir tout de même qu'à cause du modèle de compilation de C++ en unités de traduction indépendantes qui sont ensuite liées, les compilateurs ne sont capables d'inliner qu'à l'intérieur d'une même unité de traduction. (il y a aussi de nombreuses autres optimisations impossibles et de fonctionnalités limitées à cause de ce modèle de compilation)
    Du moins, je ne crois pas qu'un seul compilateur existant soit capable d'inliner à l'édition de liens. (Edit: apparemment le compilateur d'Intel le fait -- Re-Edit: apparemment, MSVC8 aussi peut le faire...)
    Par conséquent, si tu veux qu'une fonction soit inlinée, il faut la mettre dans un fichier d'entête.

    Après, le mot-clé inline n'a pas une grande utilité. Les compilateurs n'en ont pas vraiment besoin pour inliner les fonctions, ils peuvent le faire d'eux-mêmes avec les bonnes options.
    C'est plus à utiliser dans de la méta-programmation complexe où la génération des fonctions serait vraiment problématique d'un point de vue performance.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 49
    Points : 21
    Points
    21
    Par défaut
    ok ben merci pour vos réponses, c'était instructif !

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

Discussions similaires

  1. Inliner une fonction C
    Par yann458 dans le forum Visual C++
    Réponses: 2
    Dernier message: 06/02/2012, 11h45
  2. mettre en place une fonction timer
    Par khamett dans le forum Langage
    Réponses: 3
    Dernier message: 23/03/2011, 10h52
  3. Mettre un terme à une fonction socket blocante
    Par whitebird001 dans le forum Développement
    Réponses: 1
    Dernier message: 09/03/2011, 19h09
  4. Réponses: 9
    Dernier message: 22/08/2007, 12h25

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