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 :

Disponibilité des "move-semantics" ?


Sujet :

Langage C++

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut Disponibilité des "move-semantics" ?
    Bonjour à tous,

    Je fournis une classe A via une API qui se veut "portable", et j'aimerais si possible y intégrer une sémantique de mouvement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A {
        A() {}
        A(const A& other) {}
        A& operator=(const A& other) {}
        ~A() {}
     
        #ifdef MOVESEMANTICS_AVAILABLE
        A(A&& other) {}
        A& operator=(A&& other) {}
        #endif
    };
    Y a-t-il une manière simple (via la STL par exemple) de définir ce MOVESEMANTICS_AVAILABLE, pour savoir si un compilo gère ou non cette fonctionnalité ? Ou faut-il le déterminer soi-même à coup de #ifdef, compilo par compilo, version par version ?

    PS: D'ailleurs, peut-on seulement exporter une rvalue-reference dans une DLL ?

    Merci.

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Il n'y a rien de standard pour ca. Le standard definis juste une macro qui dis la version du C++.
    Si tu utilises Boost il y a une macro pour ca (mais va falloir la chercher...)

  3. #3
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    PS: D'ailleurs, peut-on seulement exporter une rvalue-reference dans une DLL ?
    Cette question n'a pas beaucoup de sens: une r-value reference ne peut pas exister dans une interface (membre de classe par exemple ou directement exporte), donc tu ne pourrais pas l'exporter ou l'importer puis que ca n'existe que dans du code.

    Par contre dans l'interface d'une fonction (membre ou pas) qui elle meme est exportee, oui sans souci, ce n'est qu'une reference (qui a une semantique particuliere mais c'est pour le compilo, du point de vue du linker c'est juste une reference/pointeur).

    Enfin en tout cas chez moi ca marche bien.

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Par contre dans l'interface d'une fonction (membre ou pas) qui elle meme est exportee, oui sans souci, ce n'est qu'une reference (qui a une semantique particuliere mais c'est pour le compilo, du point de vue du linker c'est juste une reference/pointeur).
    Oui, je parlais d'une rvalue en tant que paramètre de fonction bien sûr.
    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class A {
        A(A& other) {}
        A(A&& other) {}
    };
    J'imagine que ces deux constructeurs peuvent coexister, et que le name-mangling produit deux nom différents, dont un spécifique aux rvalue-references ?...

    -- EDIT --
    Effectivement, Boost pourra peut-être m'être utile.
    Je suis notamment tombé sur cette page :
    http://www.boost.org/doc/libs/1_53_0..._not_supported
    Par contre ça risque de me faire inclure des tonnes de headers Boost dans mon API. Pas génial, ça.

  5. #5
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par cob59 Voir le message
    J'imagine que ces deux constructeurs peuvent coexister, et que le name-mangling produit deux nom différents, dont un spécifique aux rvalue-references ?...
    A priori oui.

    Effectivement, Boost pourra peut-être m'être utile.
    Je suis notamment tombé sur cette page :
    http://www.boost.org/doc/libs/1_53_0..._not_supported
    Par contre ça risque de me faire inclure des tonnes de headers Boost dans mon API. Pas génial, ça.
    Regarde dans les dis headers, il se peut que tu puisses extraire le code et le mettre dans un header a toi. Si c'est pas le cas, ca peut etre parcequ'ils ont des configurations par compilateur, et donc tu as mieux fais d'utiliser leur macro en effet.
    Oui ca ajouterai aussi boost (ou au moins ces headers) aux requirements pour utiliser ta bibliotheque.

    Si ca pose un probleme, tu as mieux fait de faire en sorte que move-semantic soit une option qui soit activee (ou desactivee) a la main, de maniere a ce que l'utilisateur controle explicitement l'option. Si tu utilises CMake ca ne devrait pas etre difficile a mettre en place.

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    OK je vais voir ce que je peux faire avec BOOST_NO_CXX11_RVALUE_REFERENCES, ou sinon via une option dans mon CMake.
    Merci !

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,
    Citation Envoyé par cob59 Voir le message
    OK je vais voir ce que je peux faire avec BOOST_NO_CXX11_RVALUE_REFERENCES, ou sinon via une option dans mon CMake.
    Merci !
    Hummm...

    A moins que tu n'aies déjà besoin de boost pour autre chose, ne te semblerait il pas dommage d'ajouter une dépendance vers elle juste pour disposer d'un symbole défini par macro

    AMHA, tant que tu peux faire autrement, il vaut mieux éviter, qu'en penses tu

    D'autant plus qu'il devrait être, finalement, assez facile de déterminer si la sémantique de mouvement est présente ou non et donc de définir un symbole (ou non) HAS_MOVE_SEMANTIC en fonction du résultat du test, non
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    J'étais tombé sur ça pour CMake -> http://pageant.ghulbus.eu/?p=664
    Ca fait son boulot.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    J'étais tombé sur ça pour CMake -> http://pageant.ghulbus.eu/?p=664
    Ca fait son boulot.
    Ah oui tres bien. Bon faut etre en train d'utiliser CMake ce qui est pas plus evident que d'utiliser Boost pour un debutant, mais c'est bon a savoir.

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 30/11/2007, 12h58

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