Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.python > #3745

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

From Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid>
Newsgroups fr.comp.lang.python
Subject Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage
Date 2022-02-04 22:55 +0100
Organization Université de Strasbourg
Message-ID <87tudenvp5.fsf@universite-de-strasbourg.fr.invalid> (permalink)
References <ab88a9d3-a634-40c7-82d1-61bf9c0cc7d2n@googlegroups.com> <87zgn65whh.fsf@izac.org>

Show all headers | View raw


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.

Back to fr.comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage "pata...@gmail.com" <patatetom@gmail.com> - 2022-02-04 07:29 -0800
  Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage Benoit Izac <use.reply.to@INVALID.ADDRESS> - 2022-02-04 19:15 +0100
    Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid> - 2022-02-04 22:55 +0100
      Re: problème avec struct.calcsize qui retourne la même valeur alors qu'un entier non signé a été ajouté au formatage "pata...@gmail.com" <patatetom@gmail.com> - 2022-02-05 04:20 -0800

csiph-web