C++: Az enum és const konstansokat a fordító nem tárolja a létrejövő programban?
Programozzunk C nyelven c. könyv
"Az enum konstansok igazi konstansok, hisz nem tárolja őket a memóriában a fordító. Míg a #define konstansok a definiálás helyétől a fájl végéig fejtik ki hatásokat, az enum konstansokra a szokásos C láthatósági és élettartam szabályok érvényesek."
Oké ez nyilvánvaló. A Programozzunk C++ nyelven c. könyv ugyanezt írja azzal a különbséggel h ott az enum-ra ÉS A const típusú konstansokra is érvényes ez (ugyanaz a mondat csak az enum mellé a const is ott van).
Tehát ha létrehozok egy konstanstömböt, ciklussal kiíratom az elemeit és C++ fordítóval fordítom le, akkor a fordító a konstanstömböt NEM tárolja a memóriában? Ha viszont C fordítóval akkor igen? Továbbá ha a C++ nem foglal helyet a számára, akkor később a futó program honnan tudja hogy tömbnek mien elemei vannak?
A #define dolog teljesen egyértelmű és értem, csak én C-ről térek át C++ra és hirtelen érthetetlennek tűnik ez h a const konstansokat a fordító nem tárolja a memóriában. Hogy is van ez?
Nagyon hálás lennék a válaszokért, Üdv
Na most. A fordító megteheti, hogy nem foglal helyet a constoknak, egész addig, amíg valaki a címére nem kíváncsi, vagy external linkelésűvé nem kívánja tenni (extern const).
Mivel a tömbökkel együtt jár a cím is, ezért a literálokból álló tömbök (mint pl a string literálok, "pl ez a literál") igenis helyet fognak foglalni. Az más kérdés, hogy a statikus tárterületen, és adott architektúrán akár read-onlyk is lehetnek, azaz a módosításuk minden esetben undefined behavior.
Értem. Tehát ha létrehozok egy egyszerű konstanst,
const int euler_number=2.71828182845;
És pl aritmetikai műveletekben hivatkozok rá, semmi más, akkor a konstans csak a fordításkor létezik, a fordító behelyettesíti a kifejezésekbe? Ha viszont vhol lekérem a címét,
& euler_number
Akkor a ugyanúgy lefoglal számára memóriaterületet mintha sima változó lenne (int euler_number) csak az értéke nem módosítható, ugye? (illetve még a másik eset amit írtál ha külsővé - external teszem).
Jól gondolom ugye?
Nagyon-nagyon köszönöm a válaszodat! Üdv
Ha a fordítód nem túl elavult, akkor igen. Ha a fordító minden helyet lát, ahol azt a constot használják, akkor simán behelyettesíti.
De persze ha a const-od fordítási időben nem ismert, tehát egy számolt érték, akkor az is egy sima változó lesz.
Ezt terjeszti ki egy kicsit a C++11 a const_expr-el.
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!