Viitelaskenta (engl. reference counting) on ohjelmointimenetelmä, jossa ohjelman varaaman muistin käyttöä seurataan viittauksien määrällä. Viittauksien määrän laskiessa nollaan (ei enää viittauksia) muisti voidaan vapauttaa ilman häiriötä ohjelman toiminnalle.

Viitelaskennan avulla viitatut kohteet voidaan vapauttaa heti kun niitä ei enää tarvita, toisin kuin jäljittävällä roskienkeräyksellä. Viitelaskenta on myös yksinkertainen tapa muistinhallinnan toteuttamiseen.

Ohjelmointikielet kuten C++ tarjoavat standardikirjaston avulla nk. älyosoittimia (engl. smart pointer) eri tarkoituksiin, joista osa toteuttaa viitelaskennan (ks. C++11, std::shared_ptr).

LLVM/Clang kääntäjä tukee automaattista viitelaskentaa (engl. Automatic Reference Counting, ARC) mm. Objective-C kielen kanssa.[1]

Historia muokkaa

Automaattiseen muistin vapauttamiseen ehdotettiin vuonna 1960 viitelaskentaa [2] ja jäljittämismenetelmää (tracing)[3] Jäljittämiseen perustuvat menetelmät ovat olleet siitä lähtien yleisempiä kuin viitelaskentaan perustuvat. Tilanne on myöhemmin muuttunut muistin ja laskentakyvyn suhteellisen kustannuksen muutoksen myötä.[4]

Vuonna 1985 esitetyn artikkelin mukaan Lisp-ohjelmat käyttävät muistia kunnes muisti on käytetty ja ohjelma pysähtyy keräämään roskia, joka turhauttaa ohjelmoijia ja tutkijoita. Suuret Lisp-ohjelmat käyttivät 10-30 prosenttia suoritusajastaan roskien keruuseen. Ensimmäinen vaihtoehto muistin vapauttamiseen on ohjelmoijan ylläpitämä vapauttaminen. Toiseksi vaihtoehdoksi esitettiin viitelaskentaa, jolloin ohjelmoijan vastuu muistin vapauttamisesta poistuu. Viitelaskenta käyttää yhtä lisäkenttää laskuria varten, joka on positiivinen kokonaisluku. Laskuri pitää yllä montako viitettä kohteeseen on ja sen pudotessa nollaan kohde vapautetaan.[5]

Katso myös muokkaa

Lähteet muokkaa

  1. Transitioning to ARC Release Notes Apple. Viitattu 6.2.2017.
  2. George E. Collins: A method for overlapping and erasure of lists dl.acm.org. 1.12.1960. doi:10.1145/367487.367501. Viitattu 13.3.2024. (englanniksi)
  3. John McCarthy: Recursive functions of symbolic expressions and their computation by machine, Part I dl.acm.org. 1.4.1960. doi:10.1145/367177.367199. Viitattu 13.3.2024. (englanniksi)
  4. David F. Bacon & V.T. Rajan: Concurrent Cycle Collection in Reference Counted Systems (PDF) Arkistoitu . Viitattu 13.3.2024. (englanniksi)
  5. Kevin G. Cassidy: The Feasibility of Automatic Storage Reclamation with Concurrent Program Execution in a LISP Environment (PDF) joulukuu 1985. Naval Postgraduate School, Monterey/CA. Viitattu 13.3.2024. (englanniksi)
 
Käännös suomeksi
Tämä artikkeli tai sen osa on käännetty tai siihen on haettu tietoja muunkielisen Wikipedian artikkelista.
Alkuperäinen artikkeli: en:Reference counting
Tämä tietotekniikkaan liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.