gratifiant > comp.lang.* > comp.lang.c

David Roman (16/10/2003, 08h48)
Bonjour,

Souvent je vois parler du `padding', et ne sachant pas ce que c'est
j'ai parfois du mal a comprendre certain post.
Quelqu'un peut me dire ce qu'est le padding
Merci beaucoup.

David
DINH Viêt Hoà (16/10/2003, 08h55)
David Roman wrote :

> Souvent je vois parler du `padding', et ne sachant pas ce que c'est
> j'ai parfois du mal a comprendre certain post.
> Quelqu'un peut me dire ce qu'est le padding


"padding" permet d'avoir alignement mémoire en ajoutant des données par
exemple, entre deux champs de structures. Ce qui permettrait au processeur
d'aller chercher les données de façon plus rapide.

Exemple plus concret : si on a la structure toto_s suivante :

on suppose qu'on travaille sur un ensemble architecture/compilateur où les
"char" ont une taille de 8 bits, les "int", une taille de 32 bits. Et le
processeur va chercher les entiers de 32 bits alignés sur des adresses 32
bits de façon plus rapide que ceux de 8 bits.

struct toto_s {
char a;
char b;
};

Un compilateur qui n'ajoutera pas de padding en fera un simple tableau
de deux octets :

char tableau[2];

représentation octet : [a,b]

il ira chercher le premier octet pour a, le 2ème octet pour b.

Prenons un autre compilateur, il va créer le tableau suivant, et il va le
placer sur une position mémoire alignée sur 32 bits (cad que
l'adresse du tableau divisible par 4 lorsque la position mémoire est
donnée en octets)

int tableau[2];

représentation octet : [a, 0, 0, 0, b, 0, 0, 0]
------- -------

les octets ajoutés sont appelés le padding.

De cette façon, pour accéder à a, il va chercher l'entier 32 bits
positionné sur une adresse 32 bits et pour chercher b, même chose.

C'est comme si on avait une structure du genre :

struct {
char a;
char dummy1;
char dummy2;
char dummy3;
char b;
char dummy4;
char dummy5;
char dummy6;
}

reste que lorsqu'il doit placer une valeur dans "a", je pense que le
processeur doit soit avoir un accès 8 bit explicite, soit faire un calcul
de masque binaire avant d'écrire l'entier.

(Veuillez corriger ou commenter si besoin)
Al 1 (16/10/2003, 09h04)
David Roman a écrit:
> Bonjour,


bonjour,

> Souvent je vois parler du `padding', et ne sachant pas ce que c'est
> j'ai parfois du mal a comprendre certain post.
> Quelqu'un peut me dire ce qu'est le padding


c'est le complément de la notion d'alignement

> Merci beaucoup.


de rien :)

> David


et l'alignement donc: certains processeurs exigent que, et d'autres sont
plus rapides quand, les variables sont alignées, par exemple sur un x86,
il y a un alignement à 4 octets et donc:
* les variables sur 1 octet ('char') sont n'importe où en mémoire
* les variables sur 2 octets ('short') ont une adresse en mémoire qui
est multiple de 2
* les variables sur 4 octets ('long') et toutes les structures qui
dépassent 4 octets ont une adresse en mémoire multiple de 4

attention, les indications des types sont spécifiques à mon exemple, un
char ne fait pas toujours un octet

exemple:
struct {
char o1;
long o2;
char o3;
} ma_struct;

le tableau est placé en mémoire à l'adresse 1000

=> &(tableau[0].o1) = 1000 et sizeof tableau[0].o1 == 1
=> &(tableau[0].o2) = 1004 pour avoir l'alignement d'un long à 4

il y a donc 3 octets d'adresse 1001, 1002 et 1003 qui sont inutilisés
ce sont des octets de padding.

en continuant :
&(tableau[0].o3) = 1008 (4 octets après le long)

et
&(tableau[1]) = 1012 (pour l'alignement à 4 de la structure)

il y a 3 octets de padding à l'adresse 1009, 1010, 1011.

et sizof tableau[0] = 12 !
David Roman (16/10/2003, 09h35)
struct {
char o1; //=a
long o2; //=4
char o3; //=b
} ma_struct;

Ca ve dire qu'en memoire la taille de la srtucture est de 12 au lieu de 6
???
Que se passe t-il si on l'ecrit dans un fichier ???
a 0 0 0 0 0 0 4 b 0 0 0
ou
a 0 0 0 4 b
DINH Viêt Hoà (16/10/2003, 09h40)
David Roman wrote :

> struct {
> char o1; //=a
> long o2; //=4
> char o3; //=b
> } ma_struct;
> Ca ve dire qu'en memoire la taille de la srtucture est de 12 au lieu de 6
> ???
> Que se passe t-il si on l'ecrit dans un fichier ???


(a)
> a 0 0 0 0 0 0 4 b 0 0 0
> ou


(b)
> a 0 0 0 4 b


fwrite(&ma_struct, sizeof(ma_struct), 1, f);

nous écrit (a) dans le fichier.
Al 1 (16/10/2003, 09h42)
David Roman a écrit:
> struct {
> char o1; //=a
> long o2; //=4
> char o3; //=b
> } ma_struct;
> Ca ve dire qu'en memoire la taille de la srtucture est de 12 au lieu de6
> ???


oui, et il vaut mieux donc, si on veut gagner de la place, regrouper les
champs par type

struct {
char o1, o3;
long o2;
}

aura une taille de 8 chez moi [linux/x86] - mais peut aussi avoir une
taille de 6 ou de 12 ailleurs !

> Que se passe t-il si on l'ecrit dans un fichier ???
> a 0 0 0 0 0 0 4 b 0 0 0
> ou
> a 0 0 0 4 b


ou encore
a 0 0 0 4 0 0 0 b 0 0 0

en little-endian avec padding

ou encore
a 4 0 0 0 b

en little-endian sans padding

et pourquoi pas un alignement à 8 ? ça existe :-)

bref, les fichiers obtenus ne seront pas portables
David Roman (16/10/2003, 10h27)
Al 1 wrote:

[..]
> en little-endian sans padding
> et pourquoi pas un alignement à 8 ? ça existe :-)
> bref, les fichiers obtenus ne seront pas portables


Comment empecher le padding, surtout si on veux relire un fichier avec un
structure de ce type ??
Al 1 (16/10/2003, 10h44)
David Roman a écrit:
> Comment empecher le padding, surtout si on veux relire un fichier avec un
> structure de ce type ??


alors alors ...

soit tu reliras la structure avec un programme compilé avec le même
compilateur sur la même plateforme, et tu n'auras pas de problème, le
padding étant le même partout - mais tu introduis une limitation

soit ce n'est pas le cas, et il faut te poser d'autres questions, en
particulier little-endian (octet de poids faible à la fin) ou big-endian
(octet de poids fort à la fin)... et faire des fonctions de
lecture/ecriture kivontbien (qui extraient les champs un par un en
fonction de leur taille supposée, et qui les retournent si on est en
big-endian par exemple)

sachant que la taille des types (genre int sur 16 ou 32 bits selon le
compilo et la plateforme) peut aussi varier, tu te définiras surement
u8, u16 et u32 au début
DINH Viêt Hoà (16/10/2003, 11h22)
Al 1 wrote :

> soit ce n'est pas le cas, et il faut te poser d'autres questions, en
> particulier little-endian (octet de poids faible à la fin) ou big-endian
> (octet de poids fort à la fin)... et faire des fonctions de
> lecture/ecriture kivontbien (qui extraient les champs un par un en
> fonction de leur taille supposée, et qui les retournent si on est en
> big-endian par exemple)


c'est ce qu'on appelle le problème de la sérialisation des données,
enfin on arrive un peu en domaine hors-sujet là.

<HS>
XDR (utilisé dans RPC) fait ça très bien
et Corba aussi. Je crois que certaines implémentations de Corba optimisent
même le codage lorsque le transfert de données se fait entre deux machines
disposant du même type de codage.
</HS>
Zouplaz (16/10/2003, 12h50)
Al 1 - ol1 :

> sachant que la taille des types (genre int sur 16 ou 32 bits selon le
> compilo et la plateforme) peut aussi varier, tu te d‚finiras surement
> u8, u16 et u32 au d‚but


Tu veux dire qu'on définira u8 différement selon le type de plateforme avec
des #ifdef ??

Tu pourrais donner un exemple de deux ou trois définitions de u8 ?

Merci
David Roman (16/10/2003, 13h29)
Zouplaz wrote:

> Al 1 - ol1 :
> Tu veux dire qu'on définira u8 différement selon le type de plateforme avec
> des #ifdef ??
> Tu pourrais donner un exemple de deux ou trois définitions de u8 ?
> Merci


typedef char u8;
typedef short int u16;
typedef long int u32;
typedef long long int u48;

C'est ca ????
AL 1 (16/10/2003, 14h09)
"David Roman" <roman> a écrit dans le message de
news:3c7d
> Zouplaz wrote:
> typedef char u8;
> typedef short int u16;
> typedef long int u32;
> typedef long long int u48;


en général, les u sont pour les unsigned, sinon c'est s8, s16, ...
(et alors là, vérifie bien que la gestion du signe suivant la plateforme !)
long long => u64
Anthony Fleury (16/10/2003, 15h44)
DINH Viêt Hoà a écrit :

[snip exemple et explications sur le padding]
> reste que lorsqu'il doit placer une valeur dans "a", je pense que le
> processeur doit soit avoir un accès 8 bit explicite, soit faire un
> calcul de masque binaire avant d'écrire l'entier.
> (Veuillez corriger ou commenter si besoin)


Ca dépend de l'architecture en fait. À ma connaissance il y a deux types
d'architectures :
- Celles qui autorisent l'accès non aligné. Elles n'ont en général pas
d'accès 8 bits, les lignes d'adresses de poids faibles étant parfois
utilisées pour autre chose, mais par contre elles s'arrangent pour permettre
des accès en lecture ou en écriture non aligné mais avec des vitesses
d'execution plus lentes. Celle que je connais fait ca avec des opérations
logiques et deux lectures... Les autres ca doit être dans le même genre.

- D'autres par contre, telle que le MIPS et quelques autres RISC, n'ont pas
de lignes d'adresses 0 et 1 mais en plus interdisent totalement les accès
non alignés. C'est donc dans ce cas au compilateur de s'arranger pour que
tous les accès se fassent en alignés. Dans les exemples que j'ai vu ca
multiplie par exemple la taille d'un tableau de char par 4 vu que chaque
char "occupera" 4 bytes, avec 3 de padding.
Erwan David (16/10/2003, 17h37)
"Anthony Fleury" <fleury_anthony> écrivait :

> - D'autres par contre, telle que le MIPS et quelques autres RISC, n'ont pas
> de lignes d'adresses 0 et 1 mais en plus interdisent totalement les accès
> non alignés. C'est donc dans ce cas au compilateur de s'arranger pour que
> tous les accès se fassent en alignés. Dans les exemples que j'ai vu ca
> multiplie par exemple la taille d'un tableau de char par 4 vu que chaque
> char "occupera" 4 bytes, avec 3 de padding.


Certains feront ça par un accès aligné puis décalage pour amener
l'octet qui va bien au début de la valeur. Mais de toute façon ici on
s'en fout un peu : si on code proprement en C c'est le compilateur qui
s'occupera de ce genre de choses.
Emmanuel Delahaye (16/10/2003, 19h44)
In 'fr.comp.lang.c', David Roman <roman> wrote:

> Quelqu'un peut me dire ce qu'est le padding


C'est pas un gateau anglais?

;-)

Discussions similaires