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 :

stl_construct.h et opérateur new


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut stl_construct.h et opérateur new
    Bonjour tout le monde,

    Par pur curiosité, j'ai commencé à regarder l'implémentation de std::vector quand je suis tombé sur la fonction construct permettant d'allouer en mémoire un objet.
    Cette dernière fait appelle à la fonction suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <class _T1>
    inline void _Construct(_T1* __p) {
      new ((void*) __p) _T1(); // la ligne que je ne suis pas sûr de comprendre
    }
    J'interprète ce new de la façon suivante:
    1. Cast de T1* __p en void*
    2. Création d'un pointeur T1


    Est-ce que je me trompe beaucoup?
    Pourquoi ne pas utiliser le constructeur de recopie? (Parce que certaines classes n'en a pas ou est inaccessible?)

    Merci pour tout

    PS: J'ai trouvé ce code ici

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    Par défaut
    Si je ne me trompe pas, il s'agit là d'un "placement new" : on a alloué une zone mémoire (de quelque manière que ce soit) et on va dire à notre objet de s'initialiser dessus.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Par pur curiosité, j'ai commencé à regarder une implémentation de std::vector quand je suis tombé sur la fonction construct permettant d'allouer en mémoire un objet.
    Cette dernière fait appelle à la fonction suivante:
    Seul l'interface est dans le standard, pas les implémentations, qui restent à la discrétion des concepteurs de la lib.
    Et celle ci date peut être de trop d'année pour être complètement clean...

    Sinon, comme le dit dragonjoker59, c'est un placement new, qui appelle le constructeur sur une mémoire déjà allouée.
    Lire la FAQ - Qu'est-ce que "placement new" et dans quels cas l'utilise-t-on ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Merci pour vos réponses.

    @gbdivers: J'ai regardé l'implémentation présente sur Mac OS C avec GCC (qui date tout de même de 2005), et la seule différence vient du cast qui est transformé en static_cast.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Je pensais plus à une implémentation post C++11, pour voir du code moderne (genre gcc 4.7)

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Ils ont utilisé des variadic templates à la place d'un template classique pour les arguments sinon les "placement new" est toujours utilisé.

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

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 21h33
  2. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  3. opérateur new visual c++
    Par zerocoolyoussef dans le forum Visual C++
    Réponses: 4
    Dernier message: 20/11/2006, 20h01
  4. Différence opérateur new et constructeur
    Par Burckel dans le forum C++
    Réponses: 7
    Dernier message: 16/11/2006, 10h21
  5. namespace et opérateur new
    Par Sylvain Rousseau dans le forum C++
    Réponses: 3
    Dernier message: 06/01/2005, 23h24

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