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 :

c++11, utiliser le move constructeur ou un pointeur pour retourner une variable locale?


Sujet :

C++

  1. #1
    Membre confirm�

    Inscrit en
    Janvier 2006
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par d�faut c++11, utiliser le move constructeur ou un pointeur pour retourner une variable locale?
    Si j'ai bien compris std::move et les rvalue r�f�rences introduites dans c++11, le but est d'�viter des copies quand on peut r�cup�rer directement les donn�es d'un objet temporaire.
    Je me demande quand est il judicieux de l'utiliser? Par example sachant que std::vector a un move constructor, doit-on/ peut-on retourner une variable locale au lieu d'un pointeur?

    Voci mon example. Est ce que ceci est acceptable:
    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
     
    bool compPairsByValue(const std::pair<ushort,ushort>& lhs, const std::pair<ushort,ushort>& rhs) {
        return lhs.second < rhs.second;
    }
    std::map<int,int> myMap;
    ...
    std::vector<pair<int,int> > getOrderedMapVector(){
    	 std::vector<pair<int,int> > vect(myMap.cbegin(), myMap.cend());
    	 std::sort(vect.begin(), vect.end(), compPairsByValue);
    	 return vect;
    }
     
    {
    	 std::vector<pair<int,int> > vect = getOrderedMapVector();
    	 // ... utilisation du vecteur
     
    }
    ou bien vaut il mieux toujours continuer avec l'utilisation de pointeurs?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    std::vector<pair<int,int> > * getOrderedMapVectorP(){
    	std::vector<pair<int,int> > *vect = new std::vector<pair<int,int> >(myMap.cbegin(), myMap.cend());
    	std::sort(vect->begin(), vect->end(), compPairsByValue);
    	return vect;
    }
     
    {
    	std::vector<pair<int,int> > *vect = getOrderedMapVectorP();
    	// ... utilisation du vecteur
    	delete vect;
    }

  2. #2
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    Il a toujours �t� non recommand� de retourner un objet allou� par new.
    Maintenant qu'il existe des op�ration de transfert c'est encore plus vrai.
    Il faut retourner un vector. D'autant que par le RVO, il ne devrait m�me pas y avoir de copie effectu�e.

  3. #3
    Membre confirm�

    Inscrit en
    Janvier 2006
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 188
    Par d�faut
    Citation Envoy� par dalfab Voir le message
    Bonjour,

    Il a toujours �t� non recommand� de retourner un objet allou� par new.
    Maintenant qu'il existe des op�ration de transfert c'est encore plus vrai.
    Il faut retourner un vector. D'autant que par le RVO, il ne devrait m�me pas y avoir de copie effectu�e.
    Je comptais en effet retourner un vector et ma question est justement sur la RVO. Est ce �quivalent � retourner un pointeur allou� par new?
    Je donne le cas d'une fonction qui retourne un pointeur allou� par new dans un soucis d'optimisation de cr�ation du vecteur et d'initialisation directe avec it�rateurs qui ne sont accessibles que dans la function (classe) qui retourne le vecteur. Je voudrais �viter toutes copies. Il semble qu'avec la RVO ce serait le cas mais je me demande la diff�rence en terme de performance.
    Il y a just un static_cast en rvalue de plus lors du retun puis un call du move constructor qui r�cup�rera les data en utilisant la RVO, c'est bien �a?

  4. #4
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Oui, c'est cela, mais la RVO peut m�me faire plus.
    Quand une fonction retourne un objet, le compilateur peut enti�rement optimiser
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    Objet fct() {
       Objet z;
       return z;
    }
    Objet X = fct();
    Dans ce cas si c'est possible, l'objet X et l'objet z sont un seul unique objet (il s'agit de la NRVO), il n'y a donc m�me pas de copie.

    Sinon au pire, les op�rateurs de transferts seront utilis�s
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    Object X = fct(); // appel du constructeur par transfert : Objet( Objet&&valeur_retournee )
    X = fct(); // appel de la copie par transfert : operator=( Objet&&valeur_retournee )
    Dans le cas d'un vector cela revient � une simple r�assignation (3 ou 4 instructions). C'est donc optimal.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Utiliser la valeur d'un spinner lors de la d�claration d'une variable locale
    Par Jiggazzzzz dans le forum Composants graphiques
    R�ponses: 4
    Dernier message: 05/12/2011, 09h31
  2. R�ponses: 6
    Dernier message: 23/03/2010, 13h01
  3. R�ponses: 6
    Dernier message: 20/11/2009, 13h07
  4. R�ponses: 14
    Dernier message: 10/07/2008, 11h56
  5. [Configuration] php pour recuperer une variable dans l'url sans utiliser $_GET
    Par mikebranque dans le forum EDI, CMS, Outils, Scripts et API
    R�ponses: 4
    Dernier message: 22/06/2006, 20h22

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