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

Qt Discussion :

Qt Tulip vs STL


Sujet :

Qt

  1. #21
    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
    Avec les collections de QT tu auras un prix moindre sur les "mauvais" compilos qui sont moins forts pour effectuer des RVO et RNVO -- vu qu'avec les "bons" il n'y aura pas de copie. Tout le prolème est de savoir "est-ce que le compilo saura appliquer le R(N)VO dans cette fonction ?"
    Par contre tu auras un prix permanent pour les accès -- en gros un surcout par itération, ou un surcout par appel à [] si je ne me trompe pas.
    Cf l'article de linux mag pour un benchmark contre la STL de GCC

    D'ici un paquet d'années, tu ne te poseras plus cette question -> arrivée des rvalue references en C++0x qui permettront d'avoir une sémantique de déplacement sur les conteneurs standard. Le COW comme technique d'optimisation des retours par valeur va fortement perdre de son intérêt.

    PS: tes articles qui critiquent la STL, ils ont quel age ? Ils parlent de quelle implémentation et de quel compilo ?
    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...

  2. #22
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    a l'utilisation:
    vector<string> tokens = tokenize(string("bla;la;li;lere"), ';')
    c'est minimum 2 copies je pense (votre confirmation?)
    Il n'y aucune copie dans ce code avec un compilateur correct.
    Enfin si, y'a la copie de la chaîne littérale dans string, mais je pense pas que tu parlais de ça.

    alors preferez-vous de la passer en parametre ?
    void tokenize( vector<string> &tokens, const string &s, char sep )
    la je pense c'est optimal mais c'est moins jolie et moins pratique je trouve.
    C'est différent.
    Le code précédent permet simplement de créer un nouveau vecteur (ce qui signifie que tu auras besoin de copier -- mais pas en C++0x où on pourra se contenter de déplacer -- si ce n'est pas une initialisation), celui-ci permet d'en modifier un existant.

    Plus optimisé mais pas forcément plus joli à écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<string> tokens; tokenize(string("bla;la;li;lere"), ';').swap(tokens);
    Ce n'est pas plus optimisé dans ce cas avec un compilateur qui fait de la NRVO. (c'est même légèrement moins bien en fait, tu fais d'abord un appel au constructeur par défaut)
    Par contre c'est pas mal si tokens est déjà initialisé à quelque chose. Un compilateur C++0x fera cependant la même chose voire mieux de manière plus jolie avec un code naturel.
    Boost ftw

  3. #23
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    Citation Envoyé par Luc Hermitte
    PS: tes articles qui critiquent la STL, ils ont quel age ? Ils parlent de quelle implémentation et de quel compilo ?
    Je n'ai pas pu trouver l'article dont tu parlais ...
    moi j'ai lu beaucoup de discussion sur le forum KDE.

    J'aurais vraiment bien aimé avoir des chiffres et/ou du retour d'experience ...

    a+

  4. #24
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    J'ai verifié si gcc 4.1 sur mac copiait la collection de retour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<TestCopy> test = getTokens();
    ca marche ! pas de copy

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<TestCopy> test;
    test = getTokens();
    et la il y a copy :-/
    donc il faut utiliser swap ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<TestCopy> test;
    getTokens().swap(test);
    mais comme le code suivant ne compile pas parce que ce n'est pas possible d'avoir une reference sur un objet temporaire, peut-on vraiment avoir confiance dans le code ci-dessus ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<TestCopy> test;
    test.swap(getTokens());
    de maniere générale, connaissez-vous des eventuels problemes (effets de bord) a swap ?

  5. #25
    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
    Linuxmag # 79, pp72+, feuilletable ici : http://www.ed-diamond.com/feuille_lm79/index.html
    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...

  6. #26
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Pour le swap, seul le premier devrait fonctionner non ?
    Sinon, comme je l'ai dit, si tu as un compilateur qui fait les rvalue references et une bibliothèque standard qui l'exploite, ça fait le swap automatiquement.
    Boost ftw

  7. #27
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 353
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 353
    Points : 1 417
    Points
    1 417
    Par défaut
    Citation Envoyé par loufoque
    Pour le swap, seul le premier devrait fonctionner non ?
    Sinon, comme je l'ai dit, si tu as un compilateur qui fait les rvalue references et une bibliothèque standard qui l'exploite, ça fait le swap automatiquement.
    ca marche quand dans le cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<TestCopy> test = getTokens();
    mais pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<TestCopy> test;
    test = getTokens();
    dans le dernier cas il faut faire manuellement le swap

    C'est la meilleure methode donc ?

  8. #28
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    C'est marrant, j'ai tout expliqué en détail plusieurs fois, mais tu ne comprends pas.

    Bien sûr que ton deuxième code copie -- nul besoin de tester -- ce n'est pas une initialisation.
    Et ce deuxième code ne copie pas (ou plutôt, ne copie pas les données, le pointeur lui-même etc. sont quand même copiés) si tu as une bibliothèque standard qui exploite les rvalue references.
    Si tu veux, essaie avec ConceptGCC 4.3 alpha 6. Tu as des binaires pré-compilés sur leur site. Il te faudra néanmoins écrire ta propre implémentation de vector, car la version fournie est celle de libstdc++ qui n'exploite pas les rvalue references.

    Par contre, le code que tu as donné précédemment
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<TestCopy> test;
    test.swap(getTokens());
    ne devrait pas fonctionner.

    Alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<TestCopy> test;
    getTokens().swap(test);
    , si.
    Boost ftw

  9. #29
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par epsilon68
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vector<TestCopy> test;
    getTokens().swap(test);
    mais comme le code suivant ne compile pas parce que ce n'est pas possible d'avoir une reference sur un objet temporaire, peut-on vraiment avoir confiance dans le code ci-dessus?
    Oui. Note que ce n'est pas une reference sur un objet temporaire qu'il est impossible d'avoir, c'est une reference sur une lvalue (objet temporaire caracterise l'objet, lvalue caracterise la vue que tu as de l'objet; dans certains cas -- un membre qui retourne une reference avec *this par exemple -- tu peux modifier la vue que tu as de lvalue en reference).

    de maniere générale, connaissez-vous des eventuels problemes (effets de bord) a swap ?
    Non.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #30
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    inon, comme je l'ai dit, si tu as un compilateur qui fait les rvalue references et une bibliothèque standard qui l'exploite, ça fait le swap automatiquement.
    Tu vis dans quel monde? Je n'imagine pas pouvoir en utiliser avant 2011-2012 dans du code en production.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #31
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    À mon avis ça arrivera sûrement dans GCC 4.4, si ce n'est avant.
    Boost ftw

  12. #32
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    Ça arrivera sûrement dans GCC 4.4, si ce n'est avant.
    Petit rappel, gcc 4.2 est sorti il y a moins d'un mois. Ce n'est pas dans la liste des projets pour gcc 4.3. gcc 4.4, c'est dans environ deux ans vu les cycles de gcc.

    Ca nous met deja en 2009 pour ce qui sera vraissemblablement le premier compilateur release avec cette possibilite. Compter deux ou trois ans pour les autres compilateurs et stabiliser les choses avant de rentrer en production ne me semble pas excessif, surtout quand on tient compte de nos cycles a nous (des nouveaux compilateurs, ca ne s'introduit pas n'importe comment).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #33
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    En fait, ce lien dit que les rvalue references sont déjà dans le mainline et seront intégrées dans GCC 4.3.
    Boost ftw

  14. #34
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    En fait, ce lien dit que les rvalue references sont déjà dans le mainline et seront intégrées dans GCC 4.3.
    Ah bon? C'est dans la description de la branche oui. Mais je ne vois pas les rvalue references dans ce qui est deja integre pour gcc 4.3 (qui n'est pas sur cette page mais sur une autre qui s'appelle d'ailleurs "Status for Experimental C++0x Support in GCC 4.3") et ce n'est pas dans la liste du wiki pour gcc 4.3 (mais la liste n'est apparemment pas a jour puisqu'elle a une mention pour les variadic templates qui contredit celle-ci).

    Et ca ne change pas grand chose sur le fond. On est a un an ou deux d'avoir un premier support experimental dans certains compilateurs. Il faudra du temps en plus pour avoir un support solide sur tous les compilateurs. Ce qui est la condition necessaire pour utiliser quelque chose en production.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #35
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Il y a marqué que cette fonctionnalité est déjà dans la mainline, c'est à dire la branche principale.

    C'est marqué expérimental parce que le standard n'est pas encore ratifié. Donc tout peut changer.
    La fonctionnalité ne serait néanmoins pas intégrée si elle n'était pas stable.

    Pour un certain nombre, voire même la plupart, de projets on peut se permettre de choisir un compilateur cible avec lequel on travaille.
    Boost ftw

  16. #36
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par loufoque
    Il y a marqué que cette fonctionnalité est déjà dans la mainline, c'est à dire la branche principale.
    Non, c'est marque que dans la branche C++0x comme dans mainline, il y a des choses concernant C++0x. La liste de ce qui est disponible dans la branche suit. Pour mainline il faut suivre le lien en dessous et les rvalues references n'y sont pas. (En repassant sur la page, je vois une incoherence/imprecision; il n'y a pas de liens vers un patch pour les rvalue references alors que la description a l'air de dire que seuls les points avec un lien patch ne sont pas dans mainline)

    C'est marqué expérimental parce que le standard n'est pas encore ratifié. Donc tout peut changer. La fonctionnalité ne serait néanmoins pas intégrée si elle n'était pas stable.
    Je crois que nous avons des criteres differents en ce qui concerne la stabilite necessaire avant de commencer a utiliser professionnellement quelque chose.

    Pour un certain nombre, voire même la plupart, de projets on peut se permettre de choisir un compilateur cible avec lequel on travaille.
    Je n'ai pas une experience telle que je puisse faire des stats sur les projets en general. En tout cas, dans aucun projet sur lequel j'ai travaille professionnellement on utilisait moins de 3 compilateurs differents, sur des architectures differents avec des OS differents (enfin, pour le moment c'est surtout des variantes d'Unix ce qui simplifie pas mal).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 11h39
  2. STL::vector crash a l"execution
    Par sebA dans le forum MFC
    Réponses: 2
    Dernier message: 16/06/2004, 17h36
  3. Probleme de Compilation de la STL
    Par stoluup dans le forum MFC
    Réponses: 3
    Dernier message: 05/05/2004, 18h25
  4. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 02h02
  5. [Kylix] [BCB] pb avec la STL
    Par pykoon dans le forum EDI
    Réponses: 1
    Dernier message: 29/12/2002, 13h56

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