On Wed, 24 Mar 2004, zavandi wrote:

> Pai am incercat sa declar mai multe tablouri mici unul dupa altul si 
> m-am uitat la ce adrese le pune. Nu erau multipli de 32.
> 
> Si ziceam ca chiar daca ar fi fost multipli, ar fi trebuit sa scada si 
> pentru tabloul de 3 chars si pentru cel de 4, 32 bytes, nu?

Uite ce teste am facut eu.

Programul de test:
#include <stdio.h>

int main(void)
{
    char a;
    char b[LEN];
    char c;

    printf("&a = %p\nb = %p\n&c = %p\n", &a, b, &c);
}

Tabel de rezultate:
LEN  | &a         | b          | &c
-----+------------+------------+------------
 1   | 0xbffff957 | 0xbffff956 | 0xbffff955
 2   | 0xbffff957 | 0xbffff954 | 0xbffff953
 3   | 0xbffff94f | 0xbffff930 | 0xbffff92f
10   | 0xbffff94f | 0xbffff930 | 0xbffff92f
16   | 0xbffff94f | 0xbffff930 | 0xbffff92f
17   | 0xbffff94f | 0xbffff920 | 0xbffff91f
32   | 0xbffff94f | 0xbffff920 | 0xbffff91f
33   | 0xbffff94f | 0xbffff910 | 0xbffff90f
...

Analiza rezultatelor:
- in primul rand se observa ca coloana a 3-a (adresa lui c) este 
intotdeauna imediat inaintea adresei lui b (lucrurile interesante se 
produc la adresa lui a si b)
- in cazurile in care sirul este de 1 element nu se aplica nici o aliniere 
(probabil din cauza ca e deja aliniat la adresa para?)
- la 2 elemente vad ca i se aloca 3 octeti, fie din cauza mentionata de 
amicul meu (ca gcc 3.3 adauga un byte pt safety) fie pt aliniere la adresa 
para
- de la 3 elemente in sus deja incepe distractia
- in primul rand se observa ca inceputul array-ului este aliniat 
intotdeauna la 16 bytes (adresele din hexa care se termina cu 0)
- in al doilea rand se pare ca compilatorul in loc sa aloce 16 bytes pt 
array-uri intre 3 si 16 bytes, aloca 32, de fapt se observa ca alocare 
asta in plus e constanta, pt orice lungime de array el va aloca multipli 
de 16 bytes si aliniat la 16 bytes plus inca 16 bytes
- motivul pt care face asta nu-l cunosc dar oricum, alocarea nu pare sa 
fie random deloc :)

-- 
Mihai RUSU                                    Email: [EMAIL PROTECTED]
GPG : http://dizzy.roedu.net/dizzy-gpg.txt    WWW: http://dizzy.roedu.net
                       "Linux is obsolete" -- AST

--- 
Detalii despre listele noastre de mail: http://www.lug.ro/


Raspunde prin e-mail lui