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 :

Passer des types simples en paramètres


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut Passer des types simples en paramètres
    Bonjour,

    j'aimerais savoir s'il y a une différence de performance entre ces prototypages pour une seule et même tache :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void fun(size_t);
    void fun(size_t const);
    void fun(size_t const&)
    Je crois me souvenir avoir lu dans le livre d'Alexandrescu que la deuxième solution est plus efficace que la troisième mais je ne vois pas vraiment pourquoi.

    J'ai une deuxième question connexe concernant les fonctions templates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<typename T> void fun(T const&);
    Dans le cas où T peut aussi bien être un type simple qu'un objet, quelle solution préconisez-vous pour forcer les types simples à ne pas être passés par référence mais par valeur?

    Merci d'avance pour votre aide et vos conseils!

  2. #2
    Membre éprouvé Avatar de Nhaps
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 350
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Dans le cas où T peut aussi bien être un type simple qu'un objet, quelle solution préconisez-vous pour forcer les types simples à ne pas être passés par référence mais par valeur?
    Bonjour,

    Pourquoi ne pas passer les types simples par référence ?

    EDIT : sinon j'aurai dit pour ta première question que la 3eme solution est la meilleur car on m'a toujours dit par exemple pour un setteur que le prototype soit comme ta 3eme solution évitant ainsi une duplication en mémoire de ce que tu passe en paramètre.

  3. #3
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    A cause de ce qui est dit plus haut : dans le cas particulier des types simples, j'ai cru comprendre qu'il valait mieux passer par valeur que par référence. Mais je me trompe peut-être.

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Pour avoir un passage de paramètre optimal, tu peux utiliser ceci :
    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
    //! Struct used to select best way to put type in parameter : 'value' or 'const reference'
    template <typename T>
    struct CallTraits
    {
    	template <typename U, bool Big> struct CallTraitsImpl;
    	//! Struct used to select 'const reference' parameter type
    	template <typename U>
    	struct CallTraitsImpl<U, true>
    	{
    		typedef const U & Type;
    	};
    	//! Struct used to select 'value' parameter type
    	template <typename U>
    	struct CallTraitsImpl<U, false>
    	{
    		typedef U Type;
    	};
    	typedef typename CallTraitsImpl<T, (sizeof( T) > 8)>::Type ParamType;
    };
    Du coup, dans ta fonction, ça donnerait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fun(CallTraits<size_t>::ParamType p_param)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre Expert
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Par défaut
    Merci pour cette solution élégante. Je pense même qu'il est possible de cacher le booléen aux utilisateurs en passant par une autre classe de trait déterminant si un type donné est simple ou pas.

    J'ai quelques questions par rapport à cette solution :

    1. le test sizeof( T) > 8 est-il pérenne?
    2. je vois que les types simples sont passés par valeur non constante : pourquoi?

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par défaut
    Cette solution tient uniquement compte de la taille.
    Je pense que c'est la question la plus importante lors du passage d'un paramètre, la copie est à mes yeux négligeable pour une taille <= 8. Au-dessus aussi, dans une certaine limite, mais 8 est une limite qui permet à tous les types basiques de passer.

    EDIT : A la question de la pérennité du sizeof( T) > 8, je dirais oui, jusqu'à ce qu'on passe à des processeurs 128 bits.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/03/2014, 21h51
  2. Passer des types primitifs par référence constante ?
    Par FluidBlow dans le forum Langage
    Réponses: 2
    Dernier message: 24/12/2010, 15h43
  3. Passer des objets complexes en paramètres
    Par davet dans le forum Struts 2
    Réponses: 2
    Dernier message: 06/11/2008, 21h28
  4. Passer des objets Java en paramètre
    Par ruby_robber dans le forum BIRT
    Réponses: 3
    Dernier message: 23/06/2008, 12h30
  5. [SOAP] Passage des types imposés en paramètres
    Par Guybrush113 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 08/10/2007, 09h34

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