OVH Cloud OVH Cloud

Qu'est ce que le padding ?

19 réponses
Avatar
David Roman
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

10 réponses

1 2
Avatar
DINH Viêt Hoà

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)

--
DINH V. Hoa,

"quoi ? faire 500km avec MA caisse ! ca va pas nan ? ça va l'user" -- sunZ

Avatar
Al 1
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 !

Avatar
David Roman
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
Avatar
DINH Viêt Hoà

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.

--
DINH V. Hoa,

"quoi ? faire 500km avec MA caisse ! ca va pas nan ? ça va l'user" -- sunZ

Avatar
Al 1
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 de 6
???


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

Avatar
David Roman
Al 1 wrote:

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 de 6
???


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


Comment empecher le padding, surtout si on veux relire un fichier avec un
structure de ce type ??


Avatar
Al 1
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-endia n
(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

Avatar
DINH Viêt Hoà

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>

--
DINH V. Hoa,

"quoi ? faire 500km avec MA caisse ! ca va pas nan ? ça va l'user" -- sunZ

Avatar
Zouplaz
Al 1 - :

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

Avatar
David Roman
Zouplaz wrote:

Al 1 - :

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


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

C'est ca ????


1 2