Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage

Liste des GroupesRevenir à fcl python 
Sujet : Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage
De : alain (at) *nospam* universite-de-strasbourg.fr.invalid (Alain Ketterlin)
Groupes : fr.comp.lang.python
Date : 04. Feb 2022, 23:55:18
Autres entêtes
Organisation : Université de Strasbourg
Message-ID : <87tudenvp5.fsf@universite-de-strasbourg.fr.invalid>
References : 1 2
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
Benoit Izac <use.reply.to@INVALID.ADDRESS> writes:

Le 04/02/2022 à 16:29, "pata...@gmail.com" <patatetom@gmail.com> a écrit
dans le message
<ab88a9d3-a634-40c7-82d1-61bf9c0cc7d2n@googlegroups.com> :

python -c 'import struct; print(struct.calcsize("4sIQ5I2Q"),
4+4+8+(5*4)+(2*8))'
56 52

une explication ?

J'imagine que ça vient de là :
<https://en.wikipedia.org/wiki/Data_structure_alignment>, notamment
<https://en.wikipedia.org/wiki/Data_structure_alignment#Typical_alignment_of_C_structs_on_x86>.

C'est ça : l'alignement des deux derniers Q est 8 octets, mais la taile
de ce qui précède est congru à 4 modulo 8. En clair pour la structure
entière ([x,y[ est l'intervalle x inclus y exclu), on commence en
position 0 :

00: 4s (4*1 octet, alignement 1 = ok) -> [0:4[
04: I (1*4 octets, alignement 4 = ok) -> [4:8[
08: Q (1*8 octets, alignement 8 = ok) -> [8:16[
16: 5I (5*4 octets, alignement 4 = ok) -> [16:36[
36: 2Q (2*8 octets, alignement 8 = problème, 36 est pas multiple de 8)
    => padding de 4 octets pour aligner -> [36:40[
    => puis 2Q -> [40:56[

La contrainte d'alignement dépend de l'architecture (et de choix du
compilateur). Un Q (unsigned long long en C) doit en général ête aligné
sur 8 octets (c'est le cas ici). Donc oui, il y a 4 octets dans la
structure qui ne servent à rien (entre 36 et 40 si je me suis pas gouré
dans les calculs). C'est d'ailleurs pour cela qu'on ne peut pas tester
l'égalité de structures octet par octet en C (le padding peut contenir
n'importe quoi).

Pour la même raison, tu trouveras (sûrement) que "sQ" a une taille de
16, de même que "IQ", de même que "QI" Dans ce dernier exemple, le
padding est à la fin, mais il doit être là pour le cas où tu veux faire
un tableau de telles structures (le deuxième élément du tableau doit
être aligné sur un multiple de 8).

Certaines architectures acceptent des données non alignées, par exemple
des "long long" de 8 octets alignés sur 4 octets, mais en général il
faut le demander explicitement, par exemple avec l'attribut "packed" en
C avec gcc et d'autres. C'est non portable. Et même si l'architecture le
supporte, cela peut être plus lent, parce qu'une donnée peut se trouver
à cheval sur deux lignes de cache.

-- Alain.

Date Sujet#  Auteur
4 Feb 22 * problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage4pata...@gmail.com
4 Feb 22 `* Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage3Benoit Izac
4 Feb 22  `* Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage2Alain Ketterlin
5 Feb 22   `- Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage1pata...@gmail.com

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal