begin process at 2012 05 28 07:12:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Systeme

 > 

Alignement de données


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Alignement de données

samedi 4 mars 2006 à 23:12:16 | Alignement de données

julienbj


Cela fait maintenant plusieurs fois que je lis des commentaires sur l'alignement des données dans les structures.
Apres quelques recherches sur le sujet, je suis toujours autant perdu.
A quoi ça sert, comment ça marche, ou le mettre en oeuvre?

Voici un exemple que brunews a poster recemment sur une source:

sizeof(GRIDA) = 12 alors que refaite correctement GRIDB = 8:

typedef struct _GRIDA {
  char coox;
  char cooy;
  int value;
  bool flag;
} GRIDA;

typedef struct _GRIDB {
  int value;
  bool flag;
  char coox;
  char cooy;
} GRIDB;

Et bien, je ne comprends pas du tout comment GRIDB peut etre inferieur a GRIDA.
J'ai du sauter une etape, donc si vous pouviez me l'expliquer?
En fait, ce que je crois avoir compris de cet exemple: (xx est ce qui est rajoute pour l'alignement des données)
GRIDA: coox cooy xx xx | value value value value | flag xx xx xx = 12 octets
GRIDB: value value value value | flag coox cooy xx = 8 octets

Mais comment fait on alors pour dire sur quel taille aligner les données? (ici, j'ai l'impression que c'est 4).

Bref, j'espere que vous comprenez les questions que je me pose, parcque elles sont tellement floues que j'ai moi meme du mal à les ecrire.

Vive le C
Tchao
Savon
dimanche 5 mars 2006 à 02:22:59 | Re : Alignement de données

DeAtHCrAsH

Réponse acceptée !
Si tu veux en C, une structure est considéré comme correcte et optimale, a partir du moment ou les données y sont alignées.
C'est a dire que les variables sont organisées dans un ordre décroissant selon leur taille (int = 4 octets, char 1 octet, ....)
Cela est du au fait que l'adressage des variables se fait en 32bits ( 4 octets).
Une structure mal agencé, force certains compilateurs a y ajouté des octets de bourage pour arriver a des plages de 4 octets pour chaque groupes de variables si nécéssaire, d'ou
l'interet d'aligner les variables au sein d'un structures, afin d'y gagner en performance.

Shell
dimanche 5 mars 2006 à 02:37:22 | Re : Alignement de données

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Un compilo en mode par défaut (le mieux pour l'alignement correct) va aligner chaque membre d'une struct en fonction de son type et donc de sa taille. Le niveau d'alignement est de plus déterminé par le choix de la plateforme ciblée à la compilation, c'est par exemple 8 sur processeur 32 bits compatible Intel.
Je fais volontairement abstraction du cas où on spécifie une compil avec SSE(1 et 2), tu te reporteras aux manuels Intel si le sujet t'intéresse (align 16 minimal, offset de 32 mini dans le code entre chaque accès aux registres SSE, etc etc...), très vaste sujet.
[ Lien ]

Donc compil standard en mode 586:
- La struct (offset 0, le 1er membre) est alignée sur 8, transparent pour le développeur C.
- Chaque membre aura un alignement correspondant au minimum à sa taille:
 -- 32 bits sur 4
-- double sur 8
-- 16 bits sur 2
-- 8 bits sur 1

Partant de cela, le compilo aura donc transcrit ainsi la 1ere struct:
typedef struct _GRIDA {
  char coox;
  char cooy;
  char cadrage[2];
  int value; // AINSI OK EST BIEN SUR 4
  bool flag; // 1 octet en C++
  char cadrage2[3]; // REMPLISSEUR MINIMAL POUR DONNEES SUIVANTES DU REGISTRE .data
} GRIDA;
ce qui fait logiquement sizeof = 12.

GRIDB ne se voit ajouter qu'1 seul octet de remplissage à la fin, ce qui fait bien 8 alors qu'on a bien les mêmes membres, simplement en ayant placé (aligné) correctement les données.

Ne pas croire que tout ceci est pure fantaisie des concepteurs de compilo, le choix est d'ailleurs laissé au developpeur de modifier l'alignement (#prama PACK()) mais c'est normalement à bannir dans un prog en mode user tant qu'on n'a pas à mettre une struct en conformité avec les specs d'un driver.
Un DWORD non aligné sur 4 par exemple et accédé directement (int x = tabInt[2]; par exemple => MOV asm) sera sanctinné par une faute d'alignement émise par le cpu (que Windows récupèrera seul comme un grand, Linux idem je crois) et restera transparent pour le développeur MAIS se traduira par des cycles de pénalité et réduira donc fortement les performances.

ciao...
[ Lien ]
BruNews, MVP VC++
dimanche 5 mars 2006 à 03:05:25 | Re : Alignement de données

julienbj


OK, je vais mediter tout ca.
Ca fait pas mal d'infos en un soir.
Je reviendrai certainement à la quete aux détails (je risque de pas tout comprendre dans la doc intel -> Je l'avais deja recupérée et m'étais un peu embrouillé les pinceaux avec )
Merci en tout cas pour toutes ces infos, je vais aller jeter un oeil de suite à mes structures, car c'est un moyen assez simple d'accélerer son code (ou plutot de ne pas trop le ralentir).

Vive le C
Tchao
Savon
vendredi 10 mars 2006 à 00:33:22 | Re : Alignement de données

BruNews

Administrateur CodeS-SourceS
Certaines structs de driver sont en PACK(1) donc avec membres non alignés, le but est le gain de place ou alors la conformité et la continuité avec d'anciennes normes matérielles.
Si on doit bosser avec de telles structs il convient de les recopier vers des structs alignées si on doit faire de nombreux calculs dessus (copie octet par octet grace aux pointeurs).

ciao...
[ Lien ]
BruNews, MVP VC++
vendredi 10 mars 2006 à 00:41:30 | Re : Alignement de données

julienbj

Alors si le but est la compatibilité avec l'ancien, le désalignement de donnée est-il appelé à disparaitre? Le "vieux" étant de moins en moins maintenu, on peut s'attendre à ce que ces définitions de PACK(1) disparaissent, sauf s'il est envisagé une compatibilité permanente avec ce "vieux".
Je sais, la question est plus philosophique que technique. Ce ne sont que des présomptions, mais ...

Vive le C
Tchao
Savon
vendredi 10 mars 2006 à 00:48:31 | Re : Alignement de données

BruNews

Administrateur CodeS-SourceS
Mais c'est très clair, dans les structs du DDK on ne trouve plus guère de struct avec PACK(1) qui ne soit directement concernée par le matériel et heureusement.

ciao...
[ Lien ]
BruNews, MVP VC++


Cette discussion est classée dans : données, xx, value, grida, gridb


Répondre à ce message

Sujets en rapport avec ce message

Lecture et ecriture d'une base de données access [ par thino ] SalutJe voudrai avoir un code pour accéder à ma base de données sur access par la methode d'accès DAO. Exportations de données vers Word ou Excel [ par sebastien ] Bonjour, je suis étudiant (débutant en informatique) et dans le cadre de mon cours d'informatique je dois réaliser une petite application Base de donn Exportation de données access depuis borland c++ builder [ par sebastien ] Bonjour, je suis étudiant (débutant en informatique) et dans le cadre de mon cours d'informatique je dois réaliser une petite application Base de donn Accéder aux données d'une carte flash [ par Yoy ] Je souhaite pouvoir lire les données d'une carte flash insérée dans un connecteur PCMCIA d'un portable.La carte flash contient des données qui ne sont les acces aux données en gtk+ [ par ahmed ] comment se fait l'acces aux bases de donneés en gtk+...est ce qu'il y a un widget qui est responsable de l'access aux bases de données ? Accéder à une source de données ODBC [ par Alain ] Bonjour, j'aimerais savoir si il est possible et comment (exemples, site,...) accéder à une source de données ODBC comme en Java. Merci de votre aide, Connexion à une base de données SQL Server via Internet ? [ par SharKy ] J'aimerai savoir s'il est possible de se connecter à un ebase de données SQL Server via Internet selon l'adresse IP du serveur. Une fois la connecion Conversion de types de données... [ par nullspace ] J'ai jamais réussis à trouver une bonne solution pour convertir un type de variable dans une autre variable ayant un autre type.Par exemple...si j'ai connexion a une base de données [ par wres ] je voudré juste savoir comment je pe a partir de Visual C++ 6 (MFC), me connecter a une base de données créé sous access 2000 (.mdb) !si kelkun sait c lecture d'un fichier ligne par ligne et mise en variable données [ par Oxbow ] Bonjour, je vous écris afin de demander des renseignements sur le meilleur algorithme a utiliser ainsi que sur les fonctions adéquates en C++mon trava


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,451 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales