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 :

optimisation : malloc et alignement de structures


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut optimisation : malloc et alignement de structures
    Bonjour,

    Je veux réserver via malloc un espace mémoire contenant un tableau de type STRUCT_FOO (une structure quelconque).

    Est-ce que ce code fonctionne forcement ? (pour simplifier le code, on admettra que malloc ne renvoit pas NULL)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const int nb_elements = 10;
    STRUCT_FOO * tab = malloc(sizeof(STRUCT_FOO)*nb_elements);
    tab[5].prop1 = 5;
    tab[10].prop2 = 10;
    ...
    => Entre deux éléments de mon tableau, il ne faut pas du padding ? comment le calculer/gérer ?
    => L'adresse du premier élément du tableau ne doit pas être aligné sur une adresse divisible par la taille de STRUCT_FOO ? Comment gérer ce problème ?

    Merci d'avance,

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Toutes les contraintes d'alignement / offsets sont automatiquement prises en charge, c'est un avantage du C par rapport à l'assembleur. Par curiosité, pourquoi pensais-tu que tu devais te préoccuper de ce genre de chose ?

    Si pour d'obscures raisons techniques tu dois toi-même spécifier et / ou contrôler l'alignement de tes champs, des directives plus ou moins standards selon la norme utilisée existent pour ton compilateur.

    En revanche ce code plantera pour une autre raison qui est un dépassement de capacité.

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Par curiosité, pourquoi pensais-tu que tu devais te préoccuper de ce genre de chose ?
    Parce que par le passé, j'ai déja eu des problèmes de gestion de pointeurs à cause de problèmes d'alignement... malheureusement, je ne me rappelle plus exactement du problème : ma mémoire flanche

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Tu devras t'en préoccuper si tu comptes interpréter manuellement ta structure sous forme de char *, mais si tu t'en tiens aux champs définis c'est transparent.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    ok merci

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Plus précisément c'est sizeof() qui gère le padding, et malloc() retourne toujours une donnée alignée sur le plus petit entre
    * l'alignement maximum (typiquement 8 ou 16)
    * et la taille requise tronquée en puissance de 2.
    On a ainsi un resultat qui fonctionnera dans tous les cas.
    Exemple en 32bits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct A {
       short x;
       char y;
    };
    sizeof(A) //=> 4=2+2 qui est multiple du plus grand alignement, ici celui du short vaut 2
    A* p = malloc( 5 * sizeof(A) ); // => un pointeur multiple de 16 avec réservation de 4*5=20 octets
    A* q = malloc( 3 * sizeof(A) ); // => un pointeur multiple de 8 avec réservation de 4*3=12 octets
    p[1] // est à l'offset 1*8=8

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

Discussions similaires

  1. Malloc de tableau dans structure.
    Par Mornor dans le forum C
    Réponses: 2
    Dernier message: 01/05/2013, 16h14
  2. Réponses: 6
    Dernier message: 15/12/2006, 13h55
  3. alignement de structure
    Par dus dans le forum MFC
    Réponses: 3
    Dernier message: 23/06/2006, 18h21
  4. alignement parasite dans une structure !
    Par - Robby - dans le forum C
    Réponses: 4
    Dernier message: 23/03/2006, 23h02

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