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 :

Optimisation et linkage


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut Optimisation et linkage
    Bonjour,

    J'ai constaté quelque chose de simple, imaginez que vous écriviez un programme répartis en plusieurs fichiers .c, que dans l'un de ces fichiers il y ait des petites fonctions (qu'il est possible d'inliner) qui soient très utilisés dans un autre de ces fichiers.

    Le problème est que ces fonctions seront compilées à priori (selon la structure du Makefile etc) compilées séparement, afin de produire des fichiers .o distinct qui seront assemblés par la suite.

    La conséquence, c'est que les fonctions ne seront pas inlinées étant données qu'elles ne sont pas compilées dans le même contexte ! Il est donc plus économique dans ce cas là de compiler tout d'un coup, dans un énorme fichier .c que de compiler séparement et d'assembler.

    Mon soucis est que ça ne semble pas spécialement propre de faire ça, mais d'un autre coté les gains en performances peuvent être considérable.

    Existe t-il une pratique "propre" pour faire ça ?

    Merci

  2. #2
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Définir ta fonction inline dans ton .h OU dans un .h like (.inline).

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Tu n'as qu'à mettre toutes tes fonctions inline (ou du moins celles qui sont utilisées un peu partout ...) dans un même fichier, disons my_inlines.h, et inclure ce fichier dans chaque fichier source qui l'utilise. Les fonctions inline étant par défaut static, pas la peine de mettre static avant. my_inlines.h fait partie des fichiers d'implémentation et ne sera donc pas distribué avec les .h et les .libs de ta bibliothèque si tu développes une bibliothèque. Si tu développes une application, il n'y a que l'exe qui soit distribuée donc tu peux ignorer la remarque.

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Melem Voir le message
    Les fonctions inline étant par défaut static, pas la peine de mettre static avant.
    Faux. Il faurdra mettre static pour une fonction dans un .h. Ensuite, on peut ajouter inline pour demander au compilateur de le mettre inline.

    Jc

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par fearyourself Voir le message
    Faux. Il faurdra mettre static pour une fonction dans un .h. Ensuite, on peut ajouter inline pour demander au compilateur de le mettre inline.

    Jc
    Possible. J'utilise le C90 qui ne connait pas le mot-clé inline de toute façon. En C++ par contre, une fonction déclarée inline est par défaut static (ce qui m'a fait pensé que tel était aussi le cas en C99).

    EDIT : D'après mes récentes recherches c'est plutôt l'inverse, c'est en C qu'une fonction inline est par défaut static. En C++, elles sont par défaut extern.

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Melem Voir le message
    EDIT : D'après mes récentes recherches c'est plutôt l'inverse, c'est en C qu'une fonction inline est par défaut static. En C++, elles sont par défaut extern.
    Encore une fois, cela est faux. Je ne connais ni la position de C++ ou des différentes normes.

    Je sais par contre que pour GNU C, ce n'est pas le cas. Sachant que la plupart des gens compilent avec GCC, dire que inline implique static est donc faux.

    Cela dépend du compilateur, des options, est-ce que le inline de la norme C99 est suivie à la lettre, etc.

    Jc

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Tu as raison. Les normes du C et C++ n'indiquent rien au sujet du niveau de linkage par défaut d'une fonction inline, à moins que j'ai mal cherché. Tu as des références ? Parce que je me rappelle avoir vu ce que j'ai dit plus haut (avant l'edit) dans les textes de ces normes, ou peut-être un bouquin erroné alors parce que je me souviens bien avoir vu ça quelque part. Quant à l'edit, je l'ai trouvé ici. C'est quand même pas sympa de leur part de mettre du compilateur-spécifique dans une section censée être conforme à la norme .

Discussions similaires

  1. Optimisation de votre SGBDR et de vos requêtes...
    Par SQLpro dans le forum Langage SQL
    Réponses: 35
    Dernier message: 11/01/2013, 11h49
  2. Linkage Makefile et optimisation
    Par Koemgun dans le forum C++
    Réponses: 2
    Dernier message: 30/07/2010, 18h10
  3. [VB6] [BDD] Optimisation de l'accès aux données
    Par LadyArwen dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/01/2003, 13h27
  4. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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