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

  1. #201
    Invité
    Invité(e)
    Par défaut
    malloc() revoit un void*, et pourtant cette fonction a fait ses preuves et est encore très utilisée .
    D'ailleurs, il est assez probable que new appelle malloc(), mais seuls les théoriciens du C++ pourraient répondre.

  2. #202
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    malloc() revoit un void*, et pourtant cette fonction a fait ses preuves et est encore très utilisée .
    D'ailleurs, il est assez probable que new appelle malloc(), mais seuls les théoriciens du C++ pourraient répondre.
    J'ai peur que les grands théoriciens aient plus de goût pour les beaux croquis avec de belles boites et de nombreuses flèches

    Je confirme votre hypothèse. New est la version objet de malloc(), calloc()

    Par contre la gestion du C++ en ce qui concerne le delete() est aussi peu sécurisée que free() en C : crash si le pointeur résultant de l'instance parente (argument) n'a pas fait fait l'objet d'un new. dispose() en C# est sécurisé et renvoie une erreur bien propre si on essaye de "libérer" une constante par exemple. dispose() est en outre optionnel (merci la GC). En C++ sans GC delete() est complètement obligatoire (memory leak et crash aléatoire sinon)
    Dernière modification par Invité ; 22/07/2010 à 16h13.

  3. #203
    Expert éminent
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Points : 7 752
    Points
    7 752
    Par défaut
    Je dirai quand même que les points les plus délicats ne sont pas à mon sens la surcharge d'opérateur ou les pointeurs.

    La surcharge d'opérateurs n'est nuisible que si c'est une fonctionnalité mal utilisée, quant aux pointeurs, il existe des solutions du côté des smart pointers. Le toolkit Qt par exemple, utilise des objets copy-on-write très confortables qu'on peut tranquillement balader entre les fonctions, conserver en référence dans une classe, le tout sans risque de destruction prématurée.

    Le problème des déclarations sur deux fichiers h/cpp vient à mon sens de la duplication possible de la documentation, et les déclarations inline salissent un peu l'avantage de séparation cité par certains. En refactoring, la nécessité de modifier systématiquement à plusieurs endroits peut s'avérer pénible.

    J'ai par ailleurs toujours trouvé dommage que les développeurs C++ soient aussi réservés à l'égard des exceptions, préférant créer une tonne de valeurs de retour spécialisées. Balader un code d'erreur et un texte d'erreur sur plusieurs fonctions de profondeur (A appelle B appelle C appelle D appelle E) sachant que A a l'accès à l'interface utilisateur et permet d'afficher l'erreur tient du cauchemar. De nombreux if/else sont nécessaires aux tests de ces valeurs de retour et le code à écrire peut vite tripler de taille.
    Mais c'est là une question philosophique et un avis personnel surtout.

    Actuellement le C++ est, je trouve désavantagé par rapport aux technos managées qui proposent toutes un grand panel d'outils pour les applications client-serveur, webservice, SOAP et tout cela. Le travail pour exploiter un webservice XML un peu sophistiqué en C++ peut être vite un peu fastidieux, même chose pour ce qui est service web.
    Et les clients légers, les applications webs ainsi que les RIA sont des domaines dont la demande a augmenté passablement, et malheureusement C++ a peu de cartes en main dans ces secteurs.
    C'est là encore non pas une question de *capacité* du langage, mais d'écosystème et de simplicité de mise en oeuvre avec les technos et frameworks disponibles.

  4. #204
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 264
    Points
    12 264
    Par défaut
    new utilise malloc (et c'est même pas obligatoire), mais renvoie une chose typé est c'est très très loin d'être un hasard.
    De plus, bon nombre d'implémentations de la lib C ajoutent bien des choses comme une vérification des tailles, utilisation de canaries etc.
    L'illusion du contrôle du C++.

  5. #205
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par _skip Voir le message
    Je dirai quand même que les points les plus délicats ne sont pas à mon sens la surcharge d'opérateur ou les pointeurs.
    ...
    Merci Skip, point de vue très intérressant. Je me demandais si un spécialiste QT allait s'interresser à nous..

  6. #206
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 264
    Points
    12 264
    Par défaut
    C'est là encore non pas une question de *capacité* du langage, mais d'écosystème et de simplicité de mise en oeuvre avec les technos et frameworks disponibles.
    Tout à fait d'accord, mais je m'hasard à une explication à la faiblesse de l'écosystème : Le nombre d'intervenant dans la norme et leurs motivations cachées.

  7. #207
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bacelar Voir le message
    new utilise malloc (et c'est même pas obligatoire), mais renvoie une chose typé est c'est très très loin d'être un hasard.
    De plus, bon nombre d'implémentations de la lib C ajoutent bien des choses comme une vérification des tailles, utilisation de canaries etc.
    L'illusion du contrôle du C++.
    Malloc est une convention des OS qui s'occupent de la réservation mémoire. malloc() est la version C qui fait cet appel systeme avec plus ou moins de vérifications. Les OS étant tous en C/C++, les deux forment une seule entité.

    J'aime bien le pointeur void * sur un morceau de ram moi ...

    Parfois j'y range des types simples ou structs, parfois des files, des buffers... En embarqué parfois, je fais ma propre gestion ram en "empilant" les objets comme dans un flux de comm. Hormis le fait qu'il soit très chatouilleux et que le free() soit difficile à forcer en cas d'erreur par exemple, je n'ai rien à lui reprocher.

    En fait le typage d'un ptr est surtout utile pour les sizeof() (preprocesseur) ou l'arithmétique sur pointeurs, procédé ôô combien performant et ne me pose pas de problème éthique. Mais peut être qu'un théoricien va me crier dessus...

    Je me rappelle avoir expliqué ça à un conseil d'admin d'une société du cac40 , ils étaient tous restés comme deux ronds de flan. Par la suite ils avaient tranché en ma faveur en disant qu'ils voulaient un logiciel "aux normes" de ma maquette. Ils ne s'étaient pas risqués sur des termes techniques, ils voulaient juste "la même chose"

    En fait , je suppose que tous ceux qui n'aiment pas les pointeurs doivent trouver insupportable tout ce qu'on peut faire avec et qui est impossible avec des references...

    J'entends dire du mal des pointeurs depuis que java est sorti et depuis cette date , je les utilise de plus en plus , avec bonheur, efficacité et performances

    Il y a de quoi les mettre en pétard. Moi je suis fondé à me poser de questions sur les gourous qui disent ce qui est bien et mal. Un programme qui marche depuis 15 ans sans un bug , c'est mal ?
    Dernière modification par Invité ; 22/07/2010 à 16h58.

  8. #208
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    new appelle bien malloc qui appelle quelquechose de système dépendant (sous Linux / BSD, ça doit être brk / sbrk()). void* peut avoir son utilité, quand on fait du système / bas-niveau. C++ est aussi un langage de haut-niveau, avec un système de typage fort. Ce typage fort permet :
    1/ de détecter un certain nombre d'erreur
    2/ faire des optimisations

    Dans ce cadre, utiliser void* (ou boost::any) on perd toutes ces informations, et donc toutes les garanties qui vont avec. Dans certains cas, c'est donc bien / voir nécessaire. Dans la grande majorité des cas, c'est une hérésie qui fait perdre un bon nombre d'avantages d'avoir un langage compilé à typage fort.

  9. #209
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 264
    Points
    12 264
    Par défaut
    Comment outiller, vérifier ou tester automatiquement votre bout de code ?
    Un programme qui marche depuis 15 ans sans un bug
    Un programme sans bug, cela n'existe pas.
    Il y a toujours des cas d'utilisation qui le fera pêter en vol, par exemple, le programme de Voyageur 2 sous le rayonnement solaire au bout de 33 ans.
    Avec un outillage correct il est possible de faire un patchage automatique de ce genre de problème.

  10. #210
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par unBonGars Voir le message
    Je confirme votre hypothèse. New est la version objet de malloc(), calloc()
    Non, on peut faire des « new int » et des « new int[n] », rien à voir avec les objets.
    J'ai plutôt envie de dire que « new » est la version type-safe de « malloc() ».

    Par contre la gestion du C++ en ce qui concerne le delete() est aussi peu sécurisée que free() en C : crash si le pointeur résultant de l'instance parente (argument) n'a pas fait fait l'objet d'un new. dispose() en C# est sécurisé et renvoie une erreur bien propre si on essaye de "libérer" une constante par exemple. dispose() est en outre optionnel (merci la GC). En C++ sans GC delete() est complètement obligatoire (memory leak et crash aléatoire sinon)
    C'est cela… et les smart pointers servent juste à faire joli.
    D'autant plus qu'un GC ne peut pas empêcher toutes les fuites mémoire. Se reposer aveuglément sur le GC est une imprudence trop répandue.

  11. #211
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par zul Voir le message
    new appelle bien malloc qui appelle quelquechose de système dépendant (sous Linux / BSD, ça doit être brk / sbrk()). void* peut avoir son utilité, quand on fait du système / bas-niveau. C++ est aussi un langage de haut-niveau, avec un système de typage fort. Ce typage fort permet :
    1/ de détecter un certain nombre d'erreur
    2/ faire des optimisations

    Dans ce cadre, utiliser void* (ou boost::any) on perd toutes ces informations, et donc toutes les garanties qui vont avec. Dans certains cas, c'est donc bien / voir nécessaire. Dans la grande majorité des cas, c'est une hérésie qui fait perdre un bon nombre d'avantages d'avoir un langage compilé à typage fort.
    je comprend ça.
    Mais l'embarqué, c'est la loi de la jungle.
    D'autre part, on fait toujours un malloc avec son cast. Cela répond à cette question, on peut refaire le cast quand on veut.... je ne vois vraiment pas ou est le problème.

    Enfin, j'apprécie dans C et moindre mesure C++ la possibilité de trouver du boulot dans l'embarqué de qualité spatiale ou militaire !!!!! Ce n'est pas avec des généralités qu'on obtient un projet top niveau, c'est avec des résultats.
    Le C le permet, c'est fonctionnel, testé avec protocoles. C'est documenté.

    Ca marche. Certains me l'ont accordé à reculons mais ils ont dû reconnaitre que je diminuais le coût du hardware , controleur moins rapide, batterie de capacité inférieure.
    L'argument de conformité n'a pas suffi , sinon j'aurais perdu la mission ! Il faut quand même dire qu'en situation de marché, le client a son mot à dire.

    Je dois vous avouer que si emporter une compétition comme celle là consiste à chercher les failles d'ingénieur et violer igniominieusement les dogmes , c'est un exercice que je trouve extraordinairement gratifiant. Qu'un tel projet intéresse Boeing et la Nasa relativise sur la méthode. Même si ces deux sociétés ont juste demandé de l'information.

  12. #212
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 159
    Points
    3 159
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Un programme sans bug, cela n'existe pas.
    Hé bien si, il y en un .

  13. #213
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Un programme sans bug, cela n'existe pas.
    Bien sûr que si, enfin.
    Tu n'as jamais vu les pubs pour Google Chrome dans le métro ?

  14. #214
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 264
    Points
    12 264
    Par défaut
    Cela me rappel un bug dans une librairie qui était en prod depuis plus de 15 dans des centaines d'exécutables utilisés par des centaines de traders tous les jours.
    Le hic, c'est qu'avec l'inflation et le montant astronomique des deals, et bien la taille d'un buffer en dur à foutu la merde pendant des mois, voir des années pour certaines applications.
    Mais elle ne pouvait pas être bogué, cette librairie multi-plateforme utilisée pendant plus de 15 ans par des centaines de développeur. C'est I-M-P-O-S-S-I-B-L-E.
    Mais sinon, le premier vol d’Ariane 5 ce n’est pas un bug, on a juste pas lu les spécifications détaillées des composants logiciels.
    J’attends toujours le programme sans bug.

  15. #215
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    Non, on peut faire des « new int » et des « new int[n] », rien à voir avec les objets.
    J'ai plutôt envie de dire que « new » est la version type-safe de « malloc() ».
    C'est cela… et les smart pointers servent juste à faire joli.
    D'autant plus qu'un GC ne peut pas empêcher toutes les fuites mémoire. Se reposer aveuglément sur le GC est une imprudence trop répandue.
    je rends grâce à votre étonnant sens du détail. Il se peut que ce que vous dites ait du sens dans votre contexte. Mais dans le mien , ça n'en a aucun. De quel genre de projet vous occupez-vous ?

    Pourriez vous mieux préciser ?

  16. #216
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Cela me rappel un bug dans une librairie qui était en prod depuis plus de 15 dans des centaines d'exécutables utilisés par des centaines de traders tous les jours.
    Le hic, c'est qu'avec l'inflation et le montant astronomique des deals, et bien la taille d'un buffer en dur à foutu la merde pendant des mois, voir des années pour certaines applications.
    Mais elle ne pouvait pas être bogué, cette librairie multi-plateforme utilisée pendant plus de 15 ans par des centaines de développeur. C'est I-M-P-O-S-S-I-B-L-E.
    Mais sinon, le premier vol d’Ariane 5 ce n’est pas un bug, on a juste pas lu les spécifications détaillées des composants logiciels.
    J’attends toujours le programme sans bug.
    Labondance du recours au smiley et la typographie sont elles destinées a suggérer le mécanisme de zygomatiques ? sérotonine, mimétisme ? empathie ?

    Les blagues de potaches sur les bugs abondent mais celle ci est elle vraiment destinée à faire rire ??

    Le problème d'Ariane provenait d'un défaut de testing, les parties incriminées étaient fonctionnelles sur d'autres plateformes. Le protocole a été fortement amendé depuis. Ce bug n'était pas une bonne nouvelle pour l'ingénierie européenne et française en particulier. Pas plus que les accidents de navette ou qu'un crash d'avion.
    Dernière modification par Invité ; 22/07/2010 à 17h57.

  17. #217
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    La théorie ? new appelle qui il veut.

    La pratique ? Par défaut il appelle régulièrement malloc. Mais il peut aussi préférer telle ou telle autre fonction propriétaire que le fournisseur a jugée plus adaptée au cas par défaut.

    La pratique bis ? On (nous, quoi) peut faire en sorte que new appelle ce que l'on veut. Par exemple, on peut le faire aller piocher dans un pool plutôt que dans le truc par défaut (malloc ou autre). Dans le même genre, on peut plugger facilement un truc qui s'occupe de surveiller les double-libérations.

  18. #218
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par unBonGars Voir le message
    J'aime bien le pointeur void * sur un morceau de ram moi ...

    Parfois j'y range des types simples ou structs, parfois des files, des buffers... En embarqué parfois, je fais ma propre gestion ram en "empilant" les objets comme dans un flux de comm. Hormis le fait qu'il soit très chatouilleux et que le free() soit difficile à forcer en cas d'erreur par exemple, je n'ai rien à lui reprocher.

    En fait le typage d'un ptr est surtout utile pour les sizeof() (preprocesseur) ou l'arithmétique sur pointeurs, procédé ôô combien performant et ne me pose pas de problème éthique. Mais peut être qu'un théoricien va me crier dessus...

    (...)

    En fait , je suppose que tous ceux qui n'aiment pas les pointeurs doivent trouver insupportable tout ce qu'on peut faire avec et qui est impossible avec des references...

    J'entends dire du mal des pointeurs depuis que java est sorti et depuis cette date , je les utilise de plus en plus , avec bonheur, efficacité et performances
    Ce que tu décris c'est surtout la fonction "accesseur sur une zone mémoire" des pointeurs. Bref, quelque chose qu'on peut tout a fait proposer dans d'autres langages (C++, Java, ...) sans pour autant que cela soit le coeur du fonctionnement du langage comme dans le C.

    En effet, rien n'empêche de définir une classe qui manipule une zone mémoire linéaire et fournit des accesseurs, de la sérialisation, ...

    Le C va plus loin dans le sens où tout ce qui est alloué par le langage (les variables, les fonctions) est accessible sous forme de pointeur, un peu à la manière de la reflection. D'ailleurs j'utilise parfois la technique "C Objet" pour disposer du principe des instances dans des programmes en pur C.

  19. #219
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par unBonGars Voir le message
    je rends grâce à votre étonnant sens du détail. Il se peut que ce que vous dites ait du sens dans votre contexte. Mais dans le mien , ça n'en a aucun.
    Ce que je voulais dire, c'est que je trouve dommage de se dire qu'on utilise new juste parce qu'« on fait de l'objet ».
    Je perçois new comme une avancée par rapport à malloc(). À vrai dire, je ne perçois pas l'intérêt d'utiliser malloc() en C++.

    De quel genre de projet vous occupez-vous ?
    En ce moment, je travaille sur une bibliothèque d'analyse de code C++ (voir signature), écrite elle-même en C++. Difficile pour moi de cacher mon attrait pour ce langage .

    Pourriez vous mieux préciser ?
    Concernant les smart pointers (ou pointeurs intelligents), je crois qu'il existe des articles sur DVP qui te répondront mieux que moi.
    Concernant les fuites mémoires des GC, même chose, je te conseille la lecture d'un article sur WeakReference (c'est du Java, mais il n'y a pas de raison que le GC de C# n'ait pas le même problème).

  20. #220
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    La théorie ? new appelle qui il veut.

    La pratique ? Par défaut il appelle régulièrement malloc. Mais il peut aussi préférer telle ou telle autre fonction propriétaire que le fournisseur a jugée plus adaptée au cas par défaut.

    La pratique bis ? On (nous, quoi) peut faire en sorte que new appelle ce que l'on veut. Par exemple, on peut le faire aller piocher dans un pool plutôt que dans le truc par défaut (malloc ou autre). Dans le même genre, on peut plugger facilement un truc qui s'occupe de surveiller les double-libérations.
    Bien vu pour le pool et les liberations à répétitions, que d'écrans bleus en moins..

Discussions similaires

  1. Réponses: 32
    Dernier message: 26/03/2010, 10h22
  2. Quel est pour vous le meilleur éditeur xml ?
    Par neo.51 dans le forum XML/XSL et SOAP
    Réponses: 87
    Dernier message: 20/02/2010, 20h04
  3. Quel est selon vous le plus gros flop d'Apple ?
    Par Katleen Erna dans le forum Actualités
    Réponses: 90
    Dernier message: 13/09/2009, 16h16
  4. Quel est, selon vous, le plus gros flop de Google ?
    Par Katleen Erna dans le forum Actualités
    Réponses: 14
    Dernier message: 10/09/2009, 23h35
  5. Quel est le langage de programmation le plus pertinent pour du traitement audio ?
    Par LeTouriste dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 02/11/2006, 11h42

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