Taille mémoire d'une structure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
superloupiot
Messages : 41
Inscription : mer. 30/déc./2009 10:11

Taille mémoire d'une structure

Message par superloupiot »

Bonjour,

Si je définis une structure comme celle-ci:
Structure ligne
  • index.c
    item.s
    te.c
    ts.c
    pu.f

EndStructure


et que ensuite je définis le tableau suivant : Dim table_articles.ligne(79)

Quelle sera la place prise en mémoire par ce tableau?

Merci.
ker2x
Messages : 61
Inscription : dim. 11/mai/2008 7:27

Re: Taille mémoire d'une structure

Message par ker2x »

Si je me trompe pas : 80 * SizeOf(ligne)
superloupiot
Messages : 41
Inscription : mer. 30/déc./2009 10:11

Re: Taille mémoire d'une structure

Message par superloupiot »

OK, merci.

Apparemment, la taille prise par item.s est de 8 octets.
Je ne comprend pas trop comment cela ce fait vu que à priori, item.s n'étant pas initialisé, on ne sait pas combien de caractères seront inscrits dedans?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Taille mémoire d'une structure

Message par Anonyme2 »

superloupiot a écrit :OK, merci.

Apparemment, la taille prise par item.s est de 8 octets.
Je ne comprend pas trop comment cela ce fait vu que à priori, item.s n'étant pas initialisé, on ne sait pas combien de caractères seront inscrits dedans?

Un tableau a une taille fixée lors de la création. On peut le redimensionner avec la commande Redim mais ce tableau aura toujours une fixe après redimensionnement.
Pour travailler avec une chaine, PureBasic stocke une adresse qu'il va utiliser pour accéder aux données de la chaine qui sont en mémoire. Dans la structure ligne, item.s est un élément fixe qui stockera cette adresse, donc sa taille est fixe. C'est une adresse, sa taille dépend du type de processeur, 32 bits ou 64 bits. En 32 bits, la taille est de 4 octets et en 64 bits, la taille est de 8 octets.
Sizeof permet de retrouver la taille de item pour la structure comme ceci

Code : Tout sélectionner

Debug SizeOf(ligne\item)
Lorsque l'on attribuera une chaine à un élément item du tableau, c'est PureBasic qui alloue de manière dynamique, l'espace en mémoire pour stocker la chaine, de même c'est PB qui désalloue cet espace mémoire pour la chaine; item aura toujours une taille fixe en mémoire, c'est un élément du tableau, pour retrouver la taille de la chaine, il y a deux commandes

len() et StringByteLength()

la deuxième permet d'avoir les valeurs précises en fonction du mode de compilation (Ascii, unicode ou UTF-8)

Une analogie peut être faite par une boîte aux lettres et son contenu.
L'adresse est celle de la boite aux lettres et la chaine est le courrier dans la boîte.
On peut mettre une lettre ou 30 lettres dans la boite mais la taille de la boite ne change pas.
ker2x
Messages : 61
Inscription : dim. 11/mai/2008 7:27

Re: Taille mémoire d'une structure

Message par ker2x »

superloupiot a écrit :OK, merci.

Apparemment, la taille prise par item.s est de 8 octets.
Je ne comprend pas trop comment cela ce fait vu que à priori, item.s n'étant pas initialisé, on ne sait pas combien de caractères seront inscrits dedans?
pour simplifier :
La chaine de caractere est stockée "ailleurs", et l'emplacement de cet "ailleurs" est specifié par ce pointeur (de 8 octets, donc).
L'avantage est que ta structure fera toujours la meme taille, du coup.
Plutot pratique pour allouer la memoire necessaire a cette structure (ou un tableau de structure)
superloupiot
Messages : 41
Inscription : mer. 30/déc./2009 10:11

Re: Taille mémoire d'une structure

Message par superloupiot »

J'ai bien compris le mécanisme.
Merci à vous deux pour ces explications.
Répondre