Hogyan működik pontosan a tömbök memóriafoglalása?
Ha van egy 2d tömböm:
arr[2][2];
azt dinamikusan csak úgy tudnám elkészíteni, ha csinálok egy mutatótömböt, ami egydimenziós tömbökre mutat:
int** arr=new int*[2];
arr[0]=new arr[2];
arr[1]=new arr[2];
Ezzel tudok 2x2 adatot tárolni (0,0 0,1 1,0 1,1)
De ez extra memóriát használ fel, mert egyrészt van két tömböm ami 2*(2*4) bájtnyi memóriát foglal el, és ezeket használom, másrészt van egy mutatótömböm, ami a tömbökre mutató mutatókat tárolja.
Na de statikusan létrehozva a tömböt is lejátszódik valami hasonló folyamat? Az nem vesz el extra memóriát?
Tegyük fel, hogy a pointer 8 bájtos (long), az int pedig 4.
Ez esetben, heap-en létrehozott dinamikus tömb esetén lesz 4+4 + 4+4 + 8+8+8+8 bájt helyfoglalásod, mert 4 db int és 4 db pointer. Mindegyik int-re mutat egy pointer.
Stack-en létrehozott tömb esetén szintén lesz 2x(2x4) bájt az int-eknek, és 4*8 bájt, mert mindegyik int-re mutat egy pointer. Ez esetben is nyilván tárolva van mindegyik int kezdőcíme, hisz különben honnan tudná a fordító, hogy hogyan érje el őket. Veremművelet esetén szerencsétlen stack pointer nem tudná, hova mutasson, ha nem lenne tárolva mindegyik adat címe.
DE!
Hogy ezt a fordító hogy oldja meg magának, az az ő magánügye. A kétdimenziós tömbök sorfolytonosan tárolódnak a memóriában, tehát | arr[0][0] | arr[0][1] | arr[1][0] | arr[1][1] |, így ha tudod a tömb kezdőcímét (arr[0][0] címe), és a tárolt adatok típusát, akkor ki tudod számolni az összes int memóriacímét. Nem tudom, hogy a fordítók pontosan mit és hogyan optimalizálnak, de nem lennék meglepődve, ha lenne ilyen jellegű optimalizáció.
Architektúrafüggő. Vannak olyan processzorok, amik nem is használnak stack-et.
De ha megnézed pl. a <vector> implementációját, az is mutatót használ, nem a stacken adja át a paramétereket.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!