Muisti ja muistiosoitteet¶
Tutustutaan seuraavassa melko yleisellä tasolla ja vahvasti yksinkertaistaen siihen, mitä tietokoneen (keskus)muisti on.
Kaikki tietokoneen käsittelemä tieto talletetaan koneen keskusmuistiin. [*] Muistia voi ajatella joukkona numeroituja lokeroita:
joista jokaiseen prosessori voi tallettaa pienen määrän tietoa. Yhtä lokeroa kutsutaan muistipaikaksi ja sen järjestysnumeroa (muisti)osoitteeksi.
Muistipaikkaan mahtuu tietoa talteen yksi tavu (byte) joka puolestaan koostuu 8 bitistä. Yleensä muistia käsitellään kuitenkin tavun monikerran kokoisina paloina.
Yhteen muistipaikkaan voidaan siis tallettaa tietoalkio, joka on
esitettävissä 8 bitillä (esim. char
).
Jos on tarve tallentaa
tietoa, joka esitetään suuremmalla bittimäärällä, niin käytetään
riittävä määrä peräkkäisiä muistipaikkoja.
Esimerkiksi jos int
-tietotyypin alkiot ovat 32-bittisiä,
voitaisiin yksi kokonaisluku (siis sen binääriesitys) tallettaa
neljään peräkkäiseen muistipaikkaan:
Vastaavasti 64-bittinen double
voitaisiin tallettaa seuraavasti:
Esimerkeistä huomataan, että samoihin muistipaikkoihin voidaan tallettaa eri aikoina eri tyyppistä informaatiota.
Koska tietokoneen uumenissa kaikki tieto esitetään bitteinä, niin pelkästään muistipaikan sisältöä tutkimalla ei voi päätellä, minkä tyyppistä dataa sinne on talletettu. Tuosta päädytään vanhaan totuuteen: Kaikella tiedolla pitää olla tyyppi, jotta sitä osattaisiin käsitellä oikein.
C++:ssa (arvosemantiikan mukaisesti) muuttujan määrittely on tapa antaa nimi jonkin muistipaikan sisällölle. Kääntäjä valitsee muuttujalle talletuspaikan muistissa ja pitää kirjaa tyyppi-informaatiosta ja muistiosoitteesta. Tyyppi-informaation perusteella kääntäjä osaa käyttää oikeita konekäskyjä muuttujan arvon (siis muistipaikkojen sisällön) käsittelyyn.
Esimerkiksi kun esitellään kokonaislukumuuttuja
int luku;
niin kääntäjä etsii jostain riittävän monta vapaata peräkkäistä
muistipaikkaa ja varaa ne muuttujan luku
talletuspaikaksi:
Jatkossa aina kun ohjelmakoodissa käytetään muuttujaa luku
, se
tulkitaan tarkoittamaan sille varatuissa muistipaikoissa olevaa
arvoa.
Jatkon kannalta on tärkeää pitää selvänä mielessä:
- jokainen muistipaikka identifioidaan yksikäsitteisellä muistiosoitteella
- muistipaikassa on tallessa varsinainen tieto
- muuttuja on nimi muistipaikkaan talletetulle arvolle,
ja näistä johdettuna:
- jokaiseen muuttujaan liittyy jokin muistiosoite (nimittäin se jossa sijaitsevassa muistipaikassa muuttujan arvo on tallettuna).
[*] | Ei koko totuus, mutta ainakin kaikki lähtötiedot ovat jossain vaiheessa talletettuina keskusmuistiin. |