Kezdőoldal » Számítástechnika » Programozás » Programozók! Ti használtok...

Programozók! Ti használtok dinamikus tömböket?

Figyelt kérdés
Az egyetemi tanárom csak statikusakat enged használni, de akárhány tényleges programozót kérdeztem, senkinek nem volt baja a dinamikus tömbökkel. C++-ban programozunk amúgy.

2021. ápr. 7. 19:01
 1/8 anonymousreview60 ***** válasza:
63%

A nem dinamikus tömbök használata erőltetésének okai:

0. Tanári faxni. Én megkérdezném, mi a kifogása.

1. A kezdő programozók elfelejtik a függvény futása után felszabadítani a lefoglalt memóriaterületet. Ez ún. memóriaszivárgáshoz vezet.

2. A dinamikus memóriahasználat - a gyakorlatlan programozónak - kevésbé áttekinthető, és akkor ne ez kösse le a figyelmet.

3. FONTOS: A dinamikus memóriahasználat miatt - esetleg a program vagy több program egyszerre - olyan memóriaigénnyel lép fel, amit az operációs rendszer nem bír kiszolgálni. Míg ha ez statikus, akkor a program vagy biztosan lefut vagy el sem indul.

4. FONTOS: A dinamikusan kezelt memória írása - főleg pointerekkel - könnyebben vezet memóriaterületírási balesetekhez, aminek - pontosabban az elkerülésének - egyes rendszerek (vasút, repülés, hadászat stb.) nagyon nagy jelentősége van.


Én is most C/C++-t tanulok a Project Euler feladatait felhasználva, és bizony sok kezdő feladathoz nem is érdemes hozzákezdeni dinamikus memóriahasználat nélkül.

2021. ápr. 7. 19:18
Hasznos számodra ez a válasz?
 2/8 anonim ***** válasza:
Ahol szükséges igen. Az 1-es válaszadó szempontjait azzal egészíteném ki, hogy időkritikus (vagy rendkívül nagy tömbökket használó) alkalmazásoknál futásidőben drasztikus lassulást okozhat. Pl. ha egy kellően nagyméretű tömb esetén reallocot kell csinálni az szerencsétlen esetben egész tömb átmozgatásával járhat (tipikus probléma a nagyméretű FEM alkalmazásoknál). Kis méretek esetén nem fáj (vagy ha nem időkritikus a cucc). Pont most néztem valamelyik FEM-nél a proci-memória-diszk (és lapozás) dolgot hát eléggé durván nő ahogy hízik a modell és folyton reallocol. Ilyenkor még lehet, hogy az is jobb ha egyből megbecsli, hogy mekkora lesz a modell mérete és akkora tömböt egy malloccal foglal, és utána nem piszkálja, csak ha nagyon kell. De az, hogy ahogy nő a modell folyton reallocol brutálisan lassítja. És ez már komolyan érezhető egy még nem is túl nagy modell esetén, ha a tömb méret eléri a 8-10 GB-ot, ott már érezhető bőven ez a lassulás (pl. az egyik elterjedt algoritmus olyan, hogy amikor új iteráció kell, akkor változhat a tömbméret és akkor egyből csinál egy realocot egy 10GB-os tömbre, és az még nem is egy eszeveszetten bonyolult modell, és nyilván oprendeszer meg fordító meg sok minden függvénye /beleértve a kapitány életkorát, a hold állását, és a közelben lévő szűzlányok számát is/, hogy hogyan viselkedik ha ilyen /vagy mégnagyobb/ méretű tömböket kell reallocálni).
2021. ápr. 7. 19:46
Hasznos számodra ez a válasz?
 3/8 anonim ***** válasza:
65%

Bocs véletlenül elküldtem.

Próbáld ki írj egy programot ami lefoglal egy 10GB-os tömböt, és ezt kezd el növelni 250 kByte-os lépesekben. Nézd meg, hogy milyen gyors lesz, és mennyi lesz a proci-diszk-memória igényed (feltételezve, hogy 16GB RAM van a gépedben, ha 32 akkor indulj 25GB-os tömbmérettel, ha 64GB RAM-od van akkor 60GB-ról indulj).

2021. ápr. 7. 19:53
Hasznos számodra ez a válasz?
 4/8 anonymousreview60 ***** válasza:
64%

#3: Ez a lassulás igaz, de

Egyrészt ez roppant erőforráspazarló, ha a az esetek 98%-ában 10 MB-ot, de néha 628 MB-ot igénylő programhoz mindig 628 MB-ot foglal le a program.

Másrészt van olyan, hogy nem tudjuk, mekkora bmenő adattömbbel kell dolgozni, de a programnak mindig le kell futnia. Ehhez akkor vagy lefoglalom az összes memóriát vagy dinamikus tömböt alkalamazok.

2021. ápr. 7. 20:27
Hasznos számodra ez a válasz?
 5/8 anonim ***** válasza:
Java pl. úgy csinálja, hogy ha csak egyetlen karakterrel is növelem egy StringBuilder/StringBuffer hosszát, kétszer akkora helyet foglal le neki mint amekkora addig volt, nem plusz egy karakternyit. Szerintem ez egy jó kompromisszum.
2021. ápr. 7. 20:32
Hasznos számodra ez a válasz?
 6/8 anonim ***** válasza:

4: azt lehet csinálni, hogy az első foglalás előtt egy becslést csinál, hogy vajon mekkora is kellhet. Vagy az ilyen nagyon durva (bár igaz most extrém alkalmazásról beszélek) memória igényű alkalmazás van akkor a felhasználó mondhassa meg, hogy mekkora legyen a tömb inicializálási mérete.

5: Igen ez egy nagyon jó kompromisszum, kis és közepes esetekre. Ld. pl. a fenti (nem elrugaszkodott példa) ha már eleve 25GB volt a tömböd, és kell még 1byte igény, akkor nagyon nem gazdaságos a következő lépésben 50GB-ot allokálni.

Elismerem, hogy ez egy nagyon szélsőséges eset, és nem is túl gyakori. (talán ezért is foglalkoznak nagyon kevesen ilyen rendszerek fejlesztésével, mert nem egy egyszerű probléma).

2021. ápr. 7. 20:43
Hasznos számodra ez a válasz?
 7/8 anonim ***** válasza:
42%

Ha a tanár csak úgy kijelentette, hogy sose használjatok dinamikus tömböket anélkül, hogy megindokolta volna, hogy miért, akkor az nem tanár, hanem egy okoskodó kókler. Természetesen mindkettőnek megvan a maga helye. A sebesség sem számít mindig, pl. ha könnyebb megírni, megérteni, karbantartani egy lassabb kódot, akkor sosem érdemes megpróbálni okosnak lenni és kioptimalizálni pár milliszekundumot, ha amúgy az egész induláskor egyszer fut csak le.


Hogy azt ne is említsem, hogy aki C++-t tanít 2021-ben és nem std::array-t, std::vector-t és az egyéb stl konténereket tanítja előbb, mint a C stílusú tömböket, az is emberiség ellenes bűncselekményt követ el. Nem, nem lassabb, viszont cserébe nem tudod elrontani a memóriakezelést. Eleve egy modern C++ kódban code smell, ha valaki a "new" kulcsszót leírja. Jó, Qt kivételével.


(Már több, mint 12 éve elsősorban C++ nyelven fejlesztek, 5 éve tech leadként.)

2021. ápr. 7. 23:24
Hasznos számodra ez a válasz?
 8/8 anonim ***** válasza:

Dinamikus tömbök nélkül lehetetlen élni, de az is igaz, hogy csak ott érdemes használni ezeket, ahol tényleg van létjogosultságuk, szóval, a dinamikus tömb olyan mint a cigi, rászokni semmiképp nem érdemes.


A dinamikus tömb számára a plusz memória foglalások az operációs rendszeren keresztül történnek, ez meg lehet olyan, hogy nagyon aláver a program sebességének. Ha az ütemező nem jól van megválasztva, ha a memóriamenedzser algoritmusa is épp kevéssé alkalmas, akkor annak látványos lassulás és mohó procizabálás lehet a vége. Ne feledjük, dinamikus tömb esetén a memóriafoglalás is dinamikus lesz, tehát, lehet, hogy 300 kbyte-hoz harminc helyről, fragmentumról jön össze a foglalás, ráadásul, ezeket meg, adott esetben szinte 100, hogy láncolt lista fűzi össze.

2021. ápr. 8. 00:42
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!