Même élément d'une structure mais size différents ?
Bonjour
J'aurais besoin de quelque éclaircissement sur certaines informations que je vais énoncer ci-dessous.
j'ai remarqué que deux structures ayant les mêmes données, en strictement pas la même taille et cela me force à les réaligner.
Dans l'exemple plus en bas, la différence de taille est elle dû au fait que sizeof prend en compte l'espace physique de la structure & l'espace inutilisé qui pointe sur les types de la structure ? ou c'est juste autres choses et pourquoi ?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
#include <stdio.h>
#include <stdlib.h>
// Exemple 1
struct st_ExpA{
char tA[20];
char tB[10];
char tC[5];
long lA;
long lB;
}A;
// Même structure Exemple 1
struct st_ExpB{
char tA[20];
long lA;
char tB[10];
long lB;
char tC[5];
}B;
//Forçage d'alignement
struct ts_Alig{
unsigned long pos_X: 16;
unsigned long pos_Y: 16;
}Al;
//Programme principale de teste
int main( void ){
printf( "Size A =\t%d\n", sizeof( A ) );
printf( "Size B =\t%d\n", sizeof( B ) );
return( 0 );
} |
(Après compilation en remarque que la seconde structure de donnée prend plus d'espace mémoire):weird:.
Merci d'avance pour vos réponses et à bientôt
Même élément d'une structure mais size différents ?
Bonjour
Ok. Je pense avoir compris. Les types s'alignent au bord des mots (4 octets) selon les règles d'alignement des variables et les structures toujours en début ou fin de périmètre ce qui fait que sizeof connaît la taille des données tout en prenons en compte la représentation physique de la structure mais également les zone inutilisé ce qui donne pour une structure similaire, des tailles différentes.
Pour essayer de comprendre ce que j'avance, la première structure dans le dernier exemple à une taille de 8 octets parce que les caractères s'alignent sur les 4 premiers octets et le long à la suite. Quant à la deuxième structure elle prend un peu plus d'octets car, elle aligne avant tout 3 octets avec une zone vide d'un octet puis les 4 octets du long et viens ensuite un octet pour le dernier membre avec à la suite 3 octets vide (inutile, en claire c'est du gaspillage pour rien) et la question que je me pose pourquoi c'est octet en plus pour rien :weird: est-ce volontaire.
Je vais peut-être dire une connerie mais, y aurait-il pas une option autre que "-wpadded" car ,au lieu de savoir si une structure est alignée ou pas on peut juste demander au compilateur de les réaligner.
à bientôt
Même élément d'une structure mais size différents ?
Oui tu as raison, mais bon c'est quand même du gaspillage d'octet
:merci:
Même élément d'une structure mais size différents ?
Citation:
Envoyé par
Wizard50
il ne sert a rien de ralentir le programme juste pour gagner quelques kilo-octets.
Bonjour
Oui, sert mais dans mon cas cela m'est utile car, je compte gérer une zone mémoire indépendamment du mécanisme actuel, et à terme je pense même en tiré certain avantage et merci pour l'info sur l'attribut packed je n'avais jusque-là pas eu connaissance de ça
Merci et à bientôt
Même élément d'une structure mais size différents ?
Quand j'ai dit géré de la mémoire indépendamment, c'est aussi avec un système d'adressage qui m'est propre et de façon moins complexe afin d'accéder plus rapidement à une des zones mémoire disponible. Plus clairement, j'ai une structure qui représente l'adresse postale d'une donnée (emplacement etc.), et la seconde le type de donnée à cet emplacement.
Je suis conscient que mon application ne peut être portable a cause des raisons d'économies de mémoire mais, le but est d'avoir un programme de gestion de mémoire indépendant du système actuel même si la zone mémoire réservée est fournie par le système.:aie: