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 :

Threads et C++


Sujet :

C++

  1. #21
    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
    Par défaut
    Pas dans le cas d'utilisation de certaines libs, ou quand tu veux budgetter tes différentes parties...

    Un article de blog (en français) et des commentaires très interessants sur le sujet : http://jeremy.chatelaine.name/blog/?p=36

    L'article présentant la EASTL a un chapitre résumant des contraintes qu'on a aussi dans le jeu vidéo, et qui expliquent les modifications/ajouts qu'ils proposent.

  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
    Par défaut
    Pouvoir appeler le constructeur et le destructeur manuellement est bien entendu très intéressant dès qu'on a déjà la mémoire sur laquelle on veut placer l'objet...
    Par exemple, comment implémenter sans allocation dynamique boost::optional sans ça ?

  3. #23
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Profman Voir le message
    La franchement c'est ce que j'appel de la grosse bidouille !!
    Non, c'est une technique de bas niveau utile pour implémenter certaines abstractions, ce n'est pas tout a fait la même chose. A nouveau, implémente quelque chose de similaire a vector sans cela.

    De plus je ne vois pas l'intérêt de ce code : allouer la taille de la string avec "malloc', appeler le destructeur explicitement et libérer avec "free" trop fort.

    Pourquoi ne pas utiliser que "new" et "delete" c'est fait pour ça : ça alloue et appel les bons mécanismes au bon moment.
    Il y a une différence entre montrer comme mettre en œuvre une technique et expliquer dans quel contexte il faut le faire. J'étais a mon avis clairement dans le premier cas. J'aurais pu utiliser ::operator new() et ::operator delete() a la place de malloc et free, ça n'aurais rien change sur le fond ni sur ce que je voulais montrer, et ça introduisait quelque chose de plus qui risquait d'être non familier a certains.

    Citation Envoyé par deadalnix Voir le message
    Une surcharge de new et delete sera plus élégante dans une telle situation.
    Je ne fais pas tricher et te demander une implémentation conforme de vector qui n'utilise pas cette technique (les specs de l'allocateur l'impose :-)) mais j'aimerais bien voir comment tu implémenterais élégamment et sans appel explicite au destructeur un pop_back qui détruit bien sans libérer la mémoire. Je vois bien un moyen ou deux, mais ça me semble tous des hacks bien plus gros que l'appel explicite au destructeur, ça revient fondamentalement à cela et je ne suis même pas sur de la conformité formelle d'un détail.

  4. #24
    screetch
    Invité(e)
    Par défaut
    +1 avec jean marc, boost::variant, boost::optional et std::vector sont des exemples typiques de ce genre de chose. Ca arrive de le faire, c'est pour ca que le placement new existe.

    new -> delete
    new[] -> delete []
    new(void*) -> ~T()

  5. #25
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Un truc que j'aimerais bien savoir, c'est si ce code est garanti marcher, ou bien s'il faut systématiquement faire les deux appels.

    Je me doute que pour un tableau, c'est à ne surtout pas faire, mais pour un seul objet ?
    Code C++ : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class Nimp
    {
    public:
    	int m_value;
     
    	Nimp(int value);
    	~Nimp(void);
    };
     
    void TestNew(void)
    {
    	Nimp *pNimp = static_cast< Nimp * >(::operator new(sizeof(Nimp)));
    	new(pNimp) Nimp(42);
     
    	//Test: Un simple delete au lieu de appel au destructeur + operator delete
    	delete pNimp;
    }
     
    Nimp::Nimp(int value) : m_value(value)
    {
    	std::cout << "<Nimp ctor=\"" << m_value << "\">" << std::endl;
    }
    Nimp::~Nimp(void)
    {
    	std::cout << "</Nimp>" << std::endl;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #26
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    En tout cas, ca marche chez moi avec VC. En fait, je dirais que ca marche à partir du moment où tu remplit les conditions suivantes:
    -> La zone mémoire a été correctement initialisé au regarde de l'objet, i.d. t'es passé au - une fois dans un constructeur de Nimp, ---> donc l'appel au destructeur se fera avec un objet valide
    -> La zone mémoire a été allouée de façon compatible avec le 'free' lié au delete ---> le delete sait libérer la mémoire.

  7. #27
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Un truc que j'aimerais bien savoir, c'est si ce code est garanti marcher, ou bien s'il faut systématiquement faire les deux appels.
    A priori c'est conforme tant que tu n'as pas d'operator delete dans la classe ou une classe de base.

  8. #28
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Merci.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  2. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

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