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/