Kezdőoldal » Számítástechnika » Programozás » Hogyan működik pontosan a...

Hogyan működik pontosan a tömbök memóriafoglalása?

Figyelt kérdés

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?



2017. febr. 21. 11:30
 1/4 A kérdező kommentje:
akarom írni, "stacken" létrehozva, nem statikusan.
2017. febr. 21. 12:04
 2/4 anonim ***** válasza:

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ó.

2017. febr. 21. 13:35
Hasznos számodra ez a válasz?
 3/4 A kérdező kommentje:
Utánaolvastam, stacken elméletileg úgy van megoldva (gondolom a legtöbb, ha nem az összes compilerben), ahogy te írtad, folytonosan van eltárolva az adat, egyetlen mutatóval, az első elem mutatójával. Csak heapen kell bűvészkedni a dologgal.
2017. febr. 21. 22:50
 4/4 anonim ***** válasza:

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.

2017. febr. 22. 09:38
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!