Kérdés a C/C++ nyelv volatile típusminősítéjéről?
Programozzunk C nyelven és Programozzunk C++ nyelven c. könyv:
"A volatile típusminősítővel olyan objektum hozható létre, amelyet (teljesen hivatalosan) a programunktól független kód (például egy másik futó folyamat, vagy megszakítást kezelő rutin) is megváltoztathat."
Ez oké.
"A volatile azt közli a fordítóval, hogy az nem tud mindent, ami az adott objektummal történhet."
Ez is.
"Ezért például a fordító minden egyes, ilyen tulajdonságú objektumra történő hivatkozáskor, a memóriából veszi fel az objektumhoz tartozó értéket."
Két kérdés:
1. Ha volatile változót használok (nyilván futásidőben) akkor hogy kerül a képbe a fordító? Ez nem tiszta
2. Mi az hogy a memóriából veszi fel az értéket? Eleve nem minden változóra történő hivatkozáskor (futásidőben) a program a memóriaterületéről vesz fel értéket, vagy tévednék?
Köszönöm, üdv
Nagyon köszönöm a válaszokat, csupán egyetlen egy apró kérdésem lenne:
"Mondjuk, hogy van egy 'int i' változód, amihez a fordító (ill. linker) majd hozzárendel egy címet."
Konkrétan milyen címet? A létrejövő kód adatszerkezetén hogy hol van az adat, arra egy memóriacímet? Gondolom nyilván nem a futási időben a programhoz kapcsolt memóriaterületre mutató címet mert elvileg az változó (igen, az ilyen "színfalak mögötti" dolgokban nagyon sok hiányosságom van még, ezért érdekel.
Nagyon köszönöm, üdv
Amikor azt mondod, hogy 'int i', akkor létrehoztál egy szimbólumot, ami változó neve. Mikor a fordító (compiler) lefordítja a forráskódot, akkor is még csak egy szimbólum lesz, és minden utasítás így hivatkozik rá, bár maguk az utasítások már le vannak fordítva. Ez lesz a tárgykód. A fordítás után (általában) rögtön lefut a szerkesztő is (linker), ami már a kész futtatható kódot állítja össze a tárgykód(ok)ból. Ilyenkor derül ki, hogy a memóriában melyik változó hova is fog kerülni, és a linker itt már fel tudja oldani a hivatkozásokat, vagyis a szimbólumokat kicseréli konkrét memóra címekre. Ebből lesz a közvetlenül futtatható vagy natív kód. (Lehet más eredmény is, például a java egy köztes bájtkódot generál, ami egy virtuális gépen fut. Ott pl. futásidőben dőlnek el a címek.)
Amikor címekről beszélünk, akkor persze nem konkrét fizikai memóriacímekre kell gondolni, hanem csak azt adja meg, hogy a program adatszegmensén belül hol lesznek az adatok (pl. változók). Majd indításkor fogja az operációs rendszer eldönteni, hogy hova tölti be a programot, és a proci futás közben állítja elő a tényleges címeket. (Lehet, hogy ahányszor indítod, mindig más memóriaterületre töltődik be a program, ahol épp hely van. A hivatkozásoknak mégis működniük kell. :))
(És akkor ezek még csak virtuális memória címek, ezekből megintcsak a hardver és az op.rendszer együtt fog valós fizikai címet csinálni, de ez már egy másik történet. :))
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!