Kezdőoldal » Számítástechnika » Programozás » C++: Az enum és const konstans...

C++: Az enum és const konstansokat a fordító nem tárolja a létrejövő programban?

Figyelt kérdés

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


2012. okt. 16. 17:47
 1/5 iostream ***** válasza:
40%

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.

2012. okt. 16. 19:35
Hasznos számodra ez a válasz?
 2/5 iostream ***** válasza:
35%
Jah, és a C és C++ közötti eltérést az okozza, hogy valószínűleg a könyv írásakor még nem volt const a C-ben. Azóta van.
2012. okt. 16. 19:36
Hasznos számodra ez a válasz?
 3/5 A kérdező kommentje:

É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

2012. okt. 16. 20:22
 4/5 iostream ***** válasza:
35%

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.

2012. okt. 16. 21:54
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:
Értem. Nos a "nagyon elavult"-ba gondolom 1 év nem tartozik bele (MinGW, 2011) :D Nagyon-nagyon köszönöm a válaszaidat, üdv :)
2012. okt. 17. 14:24

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!