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

Langage C++ Discussion :

Fonction InLine au contenu dynamique : Comment faire ?


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut Fonction InLine au contenu dynamique : Comment faire ?
    Bonjour,

    je voudrai savoir si il est possible de définir une fonction inLine dont le contenu ne sera connu qu'au moment de l'éxécution.

    Je sais que ce comportement est contradictoire, mais je cherche a poser la "généricité" et "l'optimisation" d'une fonction qui devrait être appeler très souvent.

    Grosso modo, je voudrai faire un fonctionnement proche d'un pointeur de fonction mais défini comme inline pour améliorer les performances.

    J'espere avoir été clair

    Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Préambule : sauf option de compilation spécifique, inline ne te garanti pas que le compilateur va effectivement inliner ton appel.
    Pour répondre plus précisément, tu pourrais nous montrer un exemple de code.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Points : 61
    Points
    61
    Par défaut
    J'était au courant que l'utilisation du inline n'était pas garantie. D'ailleur est ce que cela vaut quand meme la peine de déclarer des fonctions inline ? Est ce que des compilateurs optimise directement le code ? (désolé si ca dérive :d)

    Je n'ai pas d'exemple de code non, puisque je ne sais pas comment coder cette chose la.

    conceptuellement ca ressemblerai à ca : (attention code faux)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    void Swap1(int&, int&);
    void Swap2(int&, int&);
     
    int main(){
     
        inline void (* pFonction)(int &, int &);
     
        if( // choix de Swap1 ou Swap2)
          {
            pFonction = Swap1;
          }
        else
          {
            pFonction = Swap1;
          }
     
         while(1)     { pFonction(1,2);}
     
    }
     
    // definition de Swap1 et 2
    void Swap1(int&, int&)
    {
    //...
    }
     
    void Swap2(int&, int&)
    {
    //...
    }
    Je me rend compte du paradoxe qui consiste a dire pendant l'exécution comment optimiser la compilation.

    Mais je prefere demander, au cas ou un astuce existe.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    J'ai le sentiment que la solution si elle existe risque d'être très dépendante de ton véritable problème. C'est pour ça que je te demandais des précision. Typiquement une fonction virtuelle peut être inliné si elle est appelée de façon non polymorphe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <iostream>
    #include <string>
     
    struct A
    {
       virtual void DoIt()=0;
    };
    struct B : public A
    {
       virtual void DoIt()
       {
          std::cout<<"b"<<std::endl;
       }
    };
     
    struct C : public A
    {
       virtual void DoIt()
       {
          std::cout<<"c"<<std::endl;
       }
    };
     
    int main(){
       B b;
       C c;
       std::string b_ou_c;
       std::cin>>b_ou_c;
       A*pa(0);
       if(b_ou_c=="b"){
          pa = &b;
       }
       else{
          pa = &c;
       }
     
       b.DoIt(); // inlinee
       pa->DoIt(); // pas inlinee
    }

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Une solution peut ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    struct Swap1
    {
       static inline void swap(int&, int&){}
    };
    struct Swap2
    {
       static inline void swap(int&, int&){}
    };
     
    template<class AlgoT> 
    inline void do_it()
    {
       int i(0);
       int j(0);
       while(1)     { AlgoT::swap(i,j);}
    }
    int main(){
     
       std::string choix;
       std::cin>>choix;
        if( // choix de Swap1 ou Swap2)
          {
            do_it<Swap1>();
          }
        else
          {
            do_it<Swap2>();
          }
     
     
    }

  6. #6
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Pour en apprendre plus sur l'utilisation des templates pour la paramétrisation du comportement, tu peux regarder les toutes nouvelles Q/Rs de la FAQ C++ sur la page templates : http://cpp.developpez.com/faq/cpp/?page=templates

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/03/2012, 10h03
  2. page dynamique comment faire
    Par db48752b dans le forum ASP
    Réponses: 9
    Dernier message: 06/01/2009, 18h04
  3. Réponses: 5
    Dernier message: 22/08/2007, 15h34
  4. menu dynamique, comment faire?
    Par jeff1985 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/05/2006, 16h01
  5. [PHP-JS] menu dynamique, comment faire?
    Par jeff1985 dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2006, 13h57

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