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.
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)
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
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)
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
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)
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
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
=> &(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 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
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
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
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
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
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 ??
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
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
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
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
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
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
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 dfiniras surement u8, u16 et u32 au dbut
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
Al 1 - ol1@free.xx :
sachant que la taille des types (genre int sur 16 ou 32 bits selon le
compilo et la plateforme) peut aussi varier, tu te dfiniras surement
u8, u16 et u32 au dbut
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 ?
sachant que la taille des types (genre int sur 16 ou 32 bits selon le compilo et la plateforme) peut aussi varier, tu te dfiniras surement u8, u16 et u32 au dbut
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
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 ????
Zouplaz wrote:
Al 1 - ol1@free.xx :
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;
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;