Page 1 sur 1

Taille mémoire d'une structure

Publié : ven. 01/janv./2010 21:44
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.

Re: Taille mémoire d'une structure

Publié : ven. 01/janv./2010 23:03
par ker2x
Si je me trompe pas : 80 * SizeOf(ligne)

Re: Taille mémoire d'une structure

Publié : ven. 01/janv./2010 23:54
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?

Re: Taille mémoire d'une structure

Publié : sam. 02/janv./2010 6:57
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.

Re: Taille mémoire d'une structure

Publié : sam. 02/janv./2010 7:32
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)

Re: Taille mémoire d'une structure

Publié : sam. 02/janv./2010 11:23
par superloupiot
J'ai bien compris le mécanisme.
Merci à vous deux pour ces explications.