Programozók! Ti használtok dinamikus tömböket?
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.
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).
#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.
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).
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.)
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.
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!