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:

../../_images/muisti_01.png

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:

../../_images/muisti_02.png

Vastaavasti 64-bittinen double voitaisiin tallettaa seuraavasti:

../../_images/muisti_03.png

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:

../../_images/muisti_04.png

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.