C és C++ nyelvekben miért nem automatikusan nullával lesznek inicializálva a lokális változók?
A C nyelvet akkor alkották, amikor még processzorok sem voltak.
eleve, a két csirkefogó /Ken és Ritchie/ minimalista elveket vallott, csak azzal foglalkoztak, amivel /szerintük/ érdemes volt. A változók azért nem lettek nullára bármi m ás értékre inicializálva, mert úgy gondolták, hogy ha vki használni is fogja azokat, akkor majd értéket ad nekik, vagy a program futása során kapnak valami értéket. Ha meg nem, akkor tök mindegy, hogy nulla van adott címen vagy más.
Ez a lazy, nihilista megközelítés később okozott is gondot eleget és sajnos okoz még ma is, olykor.
csak mert sok helyen irjak, hogy akkor is adjunk kezdoerteket ha majd egyszer ugyis kap erteket
Az memória foglalás nem egyenértékű a terület beállításával. Foglalás esetén csak egy címet foglalsz le, mint ha vennél egy telket. Az már egy másik dolog, hogy a teleken mi található.
Ha a memória területet kezdő reveláns kezdő értékkel beállítod, akkor megspórolsz egy init-re szánt CPU időt. Nyilván régen, ez fontos volt, de a mai gyorsaság mellet, már nem is vennéd észre. Továbbá a C/C++ nem tartalmaz saját motort, ellentétben a C#/Python/PHP/Java/... nyelvek, amik magától értetődően GC-znek is. Így a fejlesztő felelőssége minden egyes komponens/memória felszabadítás/... feladata.
Ennek meg van az előnye és hátránya: Nagyobb felelősség, de optimálisabb kód és futás.
Én személy szerint program szerver alkalmazás minőséget vizsgálok, és régi Java-s több TB-tot kezelő programnál már láttam olyat, hogy a Java neki áll GC-zni 2 percig, addig a teljes alkalmazás bemerevedik. Igaz ez változott a Java10/11 (?) verzióval, hogy nem az összes CPU szál GC-zik egyszerre. Nah ilyen a C++ban nincs.
C/C++ban te takarítasz magad után, állítasz be dolgokat amikor épp neked kell (init érték) és minden mást.
"Foglalás esetén csak egy címet foglalsz le, "
Ey azért nem így van. Foglalás esetén egy byte-os adat esetén egy, négy byte-os adat esetén meg négy byte-nyi memóriát foglalsz le. De cím az csak kettő lesz ezekből.
"Címek mennyisége határozza meg a memória területét."
Nem egészen. Az implementációtól nagyban függ, de alapvetően az a divat, hogy a változó tipusa nyilván van tartva. Adott egy cím és legalább egy tipusazonosító. Ebből a kettőből alakul ki a foglalás. Lásd az előbbi hozzászólásomat.
Mondjuk egy tömb esetén pedig, adott a tömbelemek tipusa és azok darabszáma. Ebből a két adatból lehet indexelni bárhová a tömbön belül és persze a memo foglalás is ez alapján történik.
A char esetén van egy címed. A 4 byte-os integer esetén szintén egy címed de 4-szer annyi foglalásod. Egy 16 elemű integer tömb esetén meg 16 x 4, azaz 64 byte foglalásod és egy címed. Meg persze egy másik az indexnek, de az már más területen.
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!