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 :

Placement new et alignement memoire


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut Placement new et alignement memoire
    Bonjour,
    J'ai besoin d'utiliser le placement new pour effectuer une gestion de mémoire à partir d'un pool central et j'ai vu dans la FAQ que cela pouvais poser des problèmes au sujet de l'alignement mémoire mais pas plus de précisions. Si quelqu'un en savait plus sur ce sujet ou s'il existe une documentation complète ça m'aiderais bien.
    Merci.

    Ps : La seule erreur que je vois, ça serais d'allouer la mémoire en fonction de la taille des objet qui compose une structure mais d'avoir une taille réelle différente à cause des optimisations d'alignement du compilateur. Mais normalement en utilisent sizeof() sur la structure que l'on veux allouer je vois pas quels problèmes il peut y avoir.

  2. #2
    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
    J'ai un peu parlé de l'alignement dans ce fil.
    Ça peut t'aider à comprendre ce que ça implique.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    normalement, lorsque l on fait un malloc() en c, la fonction retourne une adresse qui peut convenir a tous les alignements possibles (genre 16 pour les instructions SEE).

    Quand tu fais un placement new, tu fournis toi meme le buffer. Donc tu peux donc fournir une adresse qui ne convient pas. Par exemple, souvent l entier int est de taille 4 octets et doit au moins avoir un alignement de 2 (si ce n est pas 4) donc en ecrivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char buffer[xxx]
     
    new (buffer) int;
     
    new (buffer + 1) int;
    tu aura au moins une erreur (a l execution de surcroit)


    sur une structure du genre

    struct {

    char a;

    int b;
    };

    un compilateur ajoutera probablement 3 octets pour l alignement de int entre a et b mais cela n empeche pas que la structure doivent elle meme etre alignee afin que l entier b soit aligne correctement aussi.

  4. #4
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Les risques encourus à ne pas aligner dépendent fortement de ton compilateur.

    Certain compilateurs s'attendent à ce que les données (classes, struct, tableaux) soient alignées (alignement réglable par une option du compilateur).
    Du coup le code généré peut trés avoir un comportement non spécifié si les
    données ne sont pas alignées (erreur du même genre que l'utilisation d'une variable non initialisée).

    Pour d'autres compilateurs, cela ne fera aucune différence.
    De toute façon il est plus propre d'aligner ses données, et en terme de performance c'est même recommandé.

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut
    Merci pour les réponses, je comprend un peu mieux le problème.
    Il faut non seulement faire attention à la taille que l'on alloue à l'objet mais aussi à l'adresse mémoire qu'on lui donne pour respecter ces contraintes d'alignement.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Par défaut
    note : l alignement "universel" (valable tout le temps) depend des instructions assembleurs que le compilateur va cree.

    En regle general (ca depend fortement de la machine un alignement de 4 ou 16 doivent convenir) (16 parait plus secure car il ,existe des instruction SSE assembleur qui ont se prerequis ... encore faut il que le compilateur soit capable de detecter la possibilite d utiliser le jeu d instructions SSE ..)

    Hors cas instruction SSE, pour une machine 32 bits (un alignement de 4 doitr convenir)

    Pour une 64 bits , par securite je choisirais plutot 8 (8 x 8bits = 64bits)


    selont les compilateurs, tu dois trouver la possibilite de fixer un alignement toi meme par des mentions genre (attribute memalign(16))

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

Discussions similaires

  1. à propos du placement new
    Par r0d dans le forum Langage
    Réponses: 2
    Dernier message: 18/11/2010, 16h56
  2. erreur placement new G++ 4.3.3
    Par ozzyyzzo dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 16/01/2010, 22h24
  3. Réponses: 7
    Dernier message: 05/09/2009, 04h00
  4. placement new sur tableau
    Par camboui dans le forum C++
    Réponses: 13
    Dernier message: 18/03/2009, 14h44
  5. On dirait un pbm d'alignement mémoire mais.....
    Par traiangueul dans le forum Linux
    Réponses: 3
    Dernier message: 27/02/2006, 10h03

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