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 :

Quelques mythes sur moc


Sujet :

Qt

  1. #1
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut Quelques mythes sur moc
    Qt est un framework C++ complet, parti des interfaces graphiques dans les années 1990 (avant la normalisation de C++) et maintenant extrêmement généraliste. L’un de ses points forts est probablement la connexion entre signaux et slots pour écrire des applications interactives : lorsqu’il se passe quelque chose dans l’application (l’utilisateur appuie sur un bouton, un paquet arrive du réseau, etc.), un signal est émis ; ensuite, le programmeur peut connecter un slot à ce signal : ce bout de code sera exécuté chaque fois que le signal sera émis. Pour implémenter cette fonctionnalité, dans les années 1990, vu l’état disparate des compilateurs, utiliser les templates C++ était impossible : les développeurs de Qt ont alors utilisé un générateur de code, nommé moc (metaobject compiler), qui sert d’autres objectifs (l’introspection et la réflexion, notamment). Avec les années, le système a été conservé, malgré le bon nombre de critiques : son importance a encore un peu grandi lors de l’arrivée de Qt Quick. Olivier Goffart, actuel mainteneur de l’outil, tente de remettre les pendules à l’heure.

    Quelques mythes

    moc ne réécrit pas le code
    qui lui est passé, il ne le réécrit pas : il l’analyse et génère de nouveaux fichiers C++, qui sont ensuite compilés de manière totalement indépendante. Sans l’outil, pour utiliser l’architecture actuelle de Qt, il serait nécessaire d’écrire de grandes quantités de code pour les tables d’introspection et d’autres détails nécessaires pour le fonctionnement des signaux et slots.

    Il se concentre sur une série de macros définies par Qt pour générer son code : Qt ne définit pas de « nouveaux mots clés » C++. Pour définir une classe héritant de QObject, la macro Q_OBJECT évite au programmeur d’écrire une série de déclarations de fonctions (dont le code est généré par moc). Les signaux sont définis dans un bloc signals:, qui n’est autre qu’une macro qui correspond à public:. Bon nombre d’autres macros utilisées par le moc ne génèrent aucun code. Globalement, le code Qt reste du code C++, ce qui fait que tous les outils C++ traditionnels restent utilisables.

    Son utilisation ne complique pas la compilation ou le débogage : la plupart des systèmes de compilation traitent de manière native moc  ; de toute façon, il s’agit simplement d’une commande supplémentaire à appliquer sur les fichiers d’en-tête. En cas d’erreur à la compilation (ce qui est très rare), le code généré est plus facile à comprendre que l’embrouillamini généré par les templates C++.

    Certains ont tenté de supprimer moc, comme CopperSpice, en promettant notamment une amélioration de performance. Cependant, cette affirmation n’est pas sous-tendue par des chiffres : le graphique ci-dessous indique que la taille des exécutables générés est bien plus grande avec CopperSpice (sans moc) que Qt (4 ou 5, avec moc). De manière générale, le code généré par moc est très efficace : il est entièrement statique et évite toute allocation dynamique de mémoire, ses données sont stockées dans les segments de données en lecture seule — là où CopperSpice génère ces mêmes données à l’exécution.



    Finalement, moc évolue : depuis Qt 5, il gère complètement les macros, ce qui permet de les utiliser pour définir des signaux, des slots, des classes de base, etc. Q_PROPERTY n’autorisait pas, jusqu’il y a peu, les virgules dans ses arguments (par exemple, en lui passant un QMap), ce qui a été réglé en un rien de temps.

    Des fonctionnalités absentes

    Finalement, la plus grande critique de moc est probablement qu’il ne gère pas les classes avec des templates, des classes imbriquées ou l’héritage multiple. Cependant, si elles ne sont pas implémentées, c’est principalement parce qu’elles ne sont pas jugées importantes. Par exemple, une implémentation des templates a été rejetée il y a trois ans ; moc-ng, une implémentation de moc sous la forme d’extension du compilateur Clang, gère sans problème les templates et les classes imbriquées. L’héritage multiple reste possible à condition que QObject soit la première classe de base — ce qui permet bon nombre d’optimisations, de telle sorte que qobject_cast est bien plus rapide que la version standard dynamic_cast.

    Et donc ?

    moc n’est pas vraiment un problème, ses plus grands pourfendeurs sont généralement ceux qui le connaissent le moins. L’API et notamment le système de métaobjets et la connexion entre signaux et slots sont à la base du succès de Qt. Les avantages des autres solutions sont loin d’être clairs et moc n’est pas une limitation pour les développeurs.

    Source : Moc myths debunked.
    Ce contenu a été publié dans Qt par dourouc05.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par dourouc05 Voir le message
    De manière générale, le code généré par moc est très efficace : il est entièrement statique
    Ce qui était aussi (surtout?) reproché aux signaux/slots de Qt était l'impossibilité de vérifier les connections à la compilation mais au contraire d'avoir une résolution systématiquement dynamique. C'était loin d'être safe et efficace, par rapport à ce que Boost.Signal offrait depuis pas mal d'années déjà.

    Qt5 a changé (corrigé) cela, et continue d'offrir ses services caractéristiques bien pratiques : connections asynchrone (entre threads), cleanup automatique des slots connectés quand l'objet cible est détruit... On peut même maintenant connecter une classe qui n'hérite pas de QObject grâce aux lambdas.

    Le trop du top serait de pouvoir déclarer ses signaux à la Boost.Signal au lieu de devoir hériter de QObject. Car moc a tout de même un inconvénient de taille : il double le nombre de fichiers .cpp à compiler, et donc augmente de façon significative le temps de build, à moins d'utiliser certaines astuces (include les .moc dans ses .cpp...). Et moc lui même n'est pas super rapide : sur des gros headers (legacy code), il prend une plombe à s'exécuter, qui plus est de façon non parallèle sur les project VC++

    Par rapport à:
    Citation Envoyé par dourouc05;
    qobject_cast est bien plus rapide que la version standard dynamic_cast
    J'aurais bien aimé avoir un benchmark / une justification... Je l'ai trouvée dans les commentaires de l'article d'origine:
    dynamic_cast has more work to do because it need to check for virtual inheritance or multiple inheritance.
    qobject_cast can just go up quickly in the QMetaObject hierarchy and do a simple conversion.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur C++
    Inscrit en
    Octobre 2008
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur C++

    Informations forums :
    Inscription : Octobre 2008
    Messages : 242
    Points : 706
    Points
    706
    Par défaut
    De toute façon CopperSpice c'est mort né. Ça se base sur Qt4 et ça utilise des les outils obsolète autoconf.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Pour le moc sur les projets VC++, jom.exe ne règle t-il pas les soucis ?
    C'est ce qu'utilise QtCreator/QMake et c'est normalement QMake qui fait les fichiers des projets VS, donc cela devrait passer, non ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 437
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 437
    Points : 43 078
    Points
    43 078
    Par défaut
    N'étant pas développeur de métier, je n'ai pas à me préoccuper de moc, c'est la compilation qui le fait pour moi. Je peux en respectant quelques règles simples, juste à ajouter Q_OBJECT sans avoir besoin de comprendre les mécanismes.

    Si moc était remplacé par un autre système, je ne m'en apercevrais même pas. Donc pour moimoc n'est pas un problème.

    Mais je n'ai pas le niveau pour vraiment juger si ça peut être un problème dans des cas précis, mis à part le problème évoqué par Auréilien de vérification à la connexion. Je n'ai pas migré sur Qt5 (je n'ai fait que de tous petits projets amateurs).
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    Mais je n'ai pas le niveau pour vraiment juger si ça peut être un problème dans des cas précis, mis à part le problème évoqué par Auréilien de vérification à la connexion. Je n'ai pas migré sur Qt5 (je n'ai fait que de tous petits projets amateurs).
    Le problème est surtout que moc c'est de la "précompilation"

    Et tant que tu as un outil qui configure ton projet à ta place c'est bon. Mais à la main c'est l'enfer

  7. #7
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Pour le moc sur les projets VC++, jom.exe ne règle t-il pas les soucis ?
    Non : jom est une version parallélisée de nmake ; en d'autres termes, un équivalent de make, pas de qmake. Avec VS, le projet généré par qmake (ou l'extension Qt, pour des versions antiques de l'EDI) s'occupe d'appeler qui de droit au bon moment.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Pour le moc sur les projets VC++, jom.exe ne règle t-il pas les soucis ?
    C'est ce qu'utilise QtCreator/QMake et c'est normalement QMake qui fait les fichiers des projets VS, donc cela devrait passer, non ?
    Les projets VS sont en fait des fichiers MSBuild qui est le système de build de MS (VS est grosso modo un front end graphique pour MSBuild). Le souci c'est que par défaut, au niveau d'un même projet, les tâches de build ne sont pas parallélisées - les builds des projets le sont mais pas les tâches au sein des projets. L'exception à cela c'est les tâches de compilation car c'est le compilo qui se fork lui-même pour traiter les demandes en parallèle (et non MSBuild qui fait le boulot). Aussi pour des tâches genre moc, pas de parallélisation automatique. Et quand y'a des milliers de fichiers à moc'er, ben ça se sent! Pour s'en sortir il faut développer son propre outil qui va exécuter moc en parallèle et donc customiser la génération des projets au lieu de passer par qmake

    Pour ne pas que le nombre de cpp à compiler double, la parade est de faire un include de son fichier moc depuis le code cpp. Ainsi qmake ne génère pas une step supplémentaire de build vu que le fichier généré est inclus dans le cpp d'origine. Ca marche pour toutes les plateformes, mais c'est un peu plus contraignant pour le programmeur. L'option plus "automatique" c'est de faire un unity build des fichiers moc générés pour les compiler tous d'un coup. Mais ça demande de développer un outil pour cela (il parait que CMake sait le faire).

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    Les projets VS sont en fait des fichiers MSBuild qui est le système de build de MS (VS est grosso modo un front end graphique pour MSBuild). Le souci c'est que par défaut, au niveau d'un même projet, les tâches de build ne sont pas parallélisées - les builds des projets le sont mais pas les tâches au sein des projets. L'exception à cela c'est les tâches de compilation car c'est le compilo qui se fork lui-même pour traiter les demandes en parallèle (et non MSBuild qui fait le boulot). Aussi pour des tâches genre moc, pas de parallélisation automatique. Et quand y'a des milliers de fichiers à moc'er, ben ça se sent! Pour s'en sortir il faut développer son propre outil qui va exécuter moc en parallèle et donc customiser la génération des projets au lieu de passer par qmake
    Autant le dire tout de suite, je ne suis plus sur du tout de mon coup sur ce point, mais, il me semble que des outils comme incredibuild (qui s'intègre très bien à visual studio) permet de partager tous les processus requis, y compris la création des moc...

    Du moins, c'est ce dont je crois me souvenir de la dernière fois où je l'ai vu tourner

    Mais bon, comme c'est un programme payant de compilation distribuée (et qu'il me semble que sa licence se monnaye à prix d'or), ce n'est pas forcément la meilleure solution à proposer non plus
    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

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Hello,

    Citation Envoyé par koala01 Voir le message
    Autant le dire tout de suite, je ne suis plus sur du tout de mon coup sur ce point, mais, il me semble que des outils comme incredibuild (qui s'intègre très bien à visual studio) permet de partager tous les processus requis, y compris la création des moc...
    Oui IncrediBuild sait paralléliser les custom build steps. Et l'outil a été intégré à Visual Studio depuis l'Update 1 comme "coordinateur" de build plus évolué que MSBuild (qui est assez mauvais au niveau task scheduling):
    https://blogs.msdn.microsoft.com/vis...l-studio-2015/
    Mais j'ai pas testé cette version (on a essayé la version full qui est effectivement assez onéreuse).

    On a finalement pas retenu l'outil car le gain promis n'était pas là dans notre cas (on a un gros gros projet assez mal fichu il faut le reconnaître). Donc pour les mocs on utilise notre outil maison en pre-build step qui scanne les headers et appelle moc en parallèle dessus si besoin.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Je crois que cela dépend surtout du matériel que tu peux mettre à disposition de la bête...

    Pour autant que mes souvenirs soient bons, incredibuild partageait systématiquement les tâches sur pas moins de 16 coeurs différents, ce qui permettait d'obtenir des temps de compilation "raisonnables", malgré la présence plusieurs milliers de fichier (au moins une bonne centaines nécessitant l'utilisation de moc)

    Mais, encore une fois, une situation n'étant pas l'autre, ce qui était vrai pour le projet dont je parle ne l'est pas forcément pour le tien
    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

  12. #12
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    Au niveau machine on est tous avec des i7 et des SSD. Le souci c'est le link. Le fait d'éparpiller les builds empêche de faire de l'incremental linking, et en plus, comme les pdb sont générés sur des machines différentes, les id internes sont différents. Il faut alors fusionner tout ça au link et sur notre exe final on se payait un link 2 ou 3 fois plus long. Sachant qu'il dure déjà 5 minutes à la base (l'exe final fait 250 Mo)... Du coup au final pour une full build oui ca va plus vite (x2 au lieu des des x6 annoncés), mais pour les build incrémentales suivantes, on perd en productivité à cause du link. Sachant que ça coûte quand même $600 par développeur... Pour l'instant ça vaut pas le coup pour nous. Apparemment avec VC++ 2015 ils ont travaillé avec MS pour faire en sorte que les id des symboles dans les pdb soient consistants d'une build à l'autre.

    Après niveau techno c'est du beau boulot : ils arrivent à builder sur des machines où VC++ n'est pas installé car ils envoient par le réseau le compilo ainsi que tout ce qu'il faut pour virtualiser son exécution. Pas mal quand même. Et ça marche pour la plupart des exécutables, donc on peut distribuer de la sorte l'exécution de ses unit tests etc...

    Une alternative libre que j'ai pas pu tester c'est FastBuild.

  13. #13
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut Verdigris : Qt sans générateur de métaobjets
    Le générateur de métaobjets de Qt, moc, est l’objet de recherches et de débats, ces derniers temps. L’année dernière, CopperSpice a été annoncé comme une bifurcation de Qt 4, l’objectif premier étant de se débarrasser du moc, en le remplaçant par des macros bien plus longues à écrire dans le code. Il y a peu, le mainteneur actuel du moc l’a défendu, en mettant en avant ses nombreux avantages par rapport à l’approche de CopperSpice, notamment pour l’écriture du code ou sa performance. Ce dernier revient à la charge : après avoir proposé une implémentation du moc basée sur des extensions du compilateur Clang ou la réflexion, il présente une autre approche qui exploite exclusivement les mécanismes de base des compilateurs C++ modernes.

    Sous le nom de Verdigris se cache une implémentation du moc exclusivement à base de macros et d’expressions constantes de C++11 (entièrement compatible avec Qt 5). Il utilise une syntaxe très similaire à CopperSpice, mais, contrairement à ce dernier, génère toutes les données des métaobjets lors de la compilation (CopperSpice le fait à l’exécution du programme). Les avantages en performance sont multiples : lors de la compilation, un programme Verdigris prendra un peu moins de temps que son équivalent Qt direct… mais beaucoup moins que la version CopperSpice ! De plus, à l’exécution, tant Qt que Verdigris ont des surcoûts très faibles par rapport à CopperSpice, puisqu’ils ont généré l’entièreté des métaobjets à la compilation.




    Ces différences d’implémentation ont également des impacts sur la compatibilité binaire, que tente de garantir Qt : l’approche suivie tant par Qt et Verdigris a cet objectif en tête (ce qui permet de changer la version des bibliothèques utilisées sans casser l’application), ce qui les empêche de réaliser certaines optimisations. Au contraire, CopperSpice cherche à optimiser certains appels de fonction et copie in extenso les données nécessaires à plusieurs endroits. Effectivement, CopperSpice est plus rapide pour certaines fonctionnalités, comme l’émission de signaux ; par contre, ces avantages sont contrebalancés par des fichiers exécutables bien plus gros et par un temps de chargement plus élevé.

    Côté développeur, tant CopperSpice que Verdigris ont des syntaxes bien plus compliquées que celles permises par l’emploi d’un générateur de code : pour déclarer un dérivé de QObject, là où Qt se satisfait d’une macro Q_OBJECT, insérée dans la définition de la classe, CopperSpice impose une certaine redondance en donnant le nom de la classe en argument, Verdigris utilise même deux macros (l’une pour déclarer l’objet, l’autre pour générer le métaobjet correspondant).


    Ces nouveaux développements montrent une fois de plus qu’il est possible de se passer du moc, mais en réalisant certains compromis, toujours défavorables en termes de syntaxe pour le moment. Ensuite, les détails d’implémentation montrent des résultats très différents en termes de compatibilité avec Qt (CopperSpice reste au niveau de fonctionnalités de Qt 4.8) et de performance.

    Source : Verdigris: Qt without moc.
    Voir aussi : les sources de Verdigris, le tutoriel.
    Ce contenu a été publié dans Qt par dourouc05.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2016
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Des fonctionnalités du c++14 sont nécessaires
    verdigri semble utiliser des fonctionnalités du c++14, notamment les variable templates.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    307
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 307
    Points : 983
    Points
    983
    Par défaut
    La syntaxe ne parait pas si tordu que ça. Ca a l'air bien.

  16. #16
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2012
    Messages : 7
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel Voir le message
    Les projets VS sont en fait des fichiers MSBuild qui est le système de build de MS (VS est grosso modo un front end graphique pour MSBuild). Le souci c'est que par défaut, au niveau d'un même projet, les tâches de build ne sont pas parallélisées - les builds des projets le sont mais pas les tâches au sein des projets. L'exception à cela c'est les tâches de compilation car c'est le compilo qui se fork lui-même pour traiter les demandes en parallèle (et non MSBuild qui fait le boulot). Aussi pour des tâches genre moc, pas de parallélisation automatique. Et quand y'a des milliers de fichiers à moc'er, ben ça se sent! Pour s'en sortir il faut développer son propre outil qui va exécuter moc en parallèle et donc customiser la génération des projets au lieu de passer par qmake

    Pour ne pas que le nombre de cpp à compiler double, la parade est de faire un include de son fichier moc depuis le code cpp. Ainsi qmake ne génère pas une step supplémentaire de build vu que le fichier généré est inclus dans le cpp d'origine. Ca marche pour toutes les plateformes, mais c'est un peu plus contraignant pour le programmeur. L'option plus "automatique" c'est de faire un unity build des fichiers moc générés pour les compiler tous d'un coup. Mais ça demande de développer un outil pour cela (il parait que CMake sait le faire).
    J'ai développé un outil pour QMake pour faire automatiquement un unity build des CPP / MOC / MOC_CPP
    Je crois que c'est toi qui m'a mis en tête que c'était possible de grouper les MOCS, j'ai testé et ça a marché
    Les perfs sont top. https://github.com/nmoreaud/qmake-unity
    Petit benchmark ici : https://github.com/nmoreaud/qmake-unity#performances

    Dans mon outil on peut soit grouper les fichiers moc_XXX.cpp (il reste X appels à MOC et 1 appel au compilo), soit grouper directement les classes à moccer (1 appel à MOC par groupe, et 1 appel au compilo).
    Je sais que la première option marche nickel parce que je l'ai utilisé sur un gros projet pendant quelque temps ; la seconde option est à tester pour voir l'impact au quotidien...

    Cela dit, je n'ai pas pris en charge MSVC (IDE), mais de souvenir ça marche bien pour MSBuild en ligne de commande.
    Si quelqu'un veut développer la prise en charge de MSVC/XCode, je suis preneur : je ne travaillerai surement plus sur un gros projet C++ avant quelque temps...


    Autre bonne nouvelle : d'après ce POST, Qt Visual Studio Tools >= 2.2 prend désormais en charge l'invocation en parallèle de MOC : https://blog.qt.io/blog/2018/02/26/q...-2-0-released/

Discussions similaires

  1. Réponses: 19
    Dernier message: 21/10/2005, 19h24
  2. Quelques questions sur la mémoire
    Par Gruik dans le forum C
    Réponses: 6
    Dernier message: 17/11/2004, 14h38
  3. Quelques question sur Win 32 Appli
    Par lvdnono dans le forum Windows
    Réponses: 5
    Dernier message: 15/06/2004, 12h37
  4. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23

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