Johdanto
Yksinkertaisin jätteenkeräysstrategia on viitteiden laskeminen. Viitteiden laskeminen on hyvin yksinkertaista, mutta se on tärkeää kääntäjän tarpeiden täyttämiseksi ja lisää kustannusten osoitusfunktiota (mutaattoria) (tämä termi on käyttäjäohjelmalle, roskankerääjän näkökulmasta). Jokaiselle objektille on liitetty viitemäärä - aktiivisten viittausten määrä objektiin. Jos kohteen viiteluku on nolla, se on roskaa (käyttäjäohjelma ei pääse siihen käsiksi), ja se voidaan kierrättää. Muokkaamalla osoittimia jokaisella aikaviittauksella (kuten osoituskäskyllä) tai kun viittaus on alueen ulkopuolella, kääntäjän on luotava koodi päivittääkseen viiteobjektin viitemäärän. Jos objektin viitemäärästä tulee nolla, se voidaan suorittaa välittömästi palauta tämä lohko (kaikkien lohkojen ja lohkon viitemäärä palautetaan referenssin vähentämiseksi) tai kerätä se jonoviiveellä.
com-komponentti säilyttää viitemäärän, johon viitataan. Kun asiakas hankki käyttöliittymäkomponentista, tämä lisää viitemäärää. Kun asiakasliittymän käyttö on valmis, viitelaskentamoduuli Tallenna 1. Kun referenssimäärän arvo on 0, komponentti voidaan poistaa omasta muistista.
käyttämällä viitelaskentaa
Miksisyy
Halutaan säilyttää erillinen viittaus jokaiseen käyttöliittymän määrään sen sijaan, että koko kokoonpanon viitemäärä sen ylläpitämiseksi?
Tähän on kaksi pääasiallista syytä: Ensinnäkin, tee virheenkorjaus helpommaksi; Toinen syy on tukiresurssien saatavuus.
1 virheenkorjaus:
oletukset unohtavat kutsun Release-liitäntöihin (itse asiassa monet ihmiset tekevät tämän virheen) ohjelmassa. Tällaisia komponentteja ei koskaan poisteta, koska se on vain viitemäärässä 0:00 delete kutsutaan. Sitten sinun on selvitettävä, milloin ja missä käyttöliittymä pitäisi julkaista. Tietysti sitä on erittäin vaikea löytää. Vain yhden rajapinnan tapauksessa koko kokoonpanon ylläpitäminen tällaisen tuloksen saavuttamiseksi on vaikeampaa löytää. Tällä hetkellä kaikki liitännät on tarkistettava tämän komponentin antamalla koodilla. Kuitenkin, jos komponentit ovat tuettuja jokaiselle rajapinnalle, joka ylläpitää viitemäärää, voit löytää tietyn rajapinnan rajoituksia. Joissakin tapauksissa tämä voi säästää paljon aikaa.
2. Hanki tarvittavat resurssit
saattaa vaatia paljon muistia tai muita resursseja liittymää toteutettaessa. Tässä tapauksessa voi suorittaa resurssien allokoinnin, kun asiakas pyytää tätä käyttöliittymää QueryInterfacen toteutuksessa. Jos viitemäärä kuitenkin ylläpitää vain koko kokoonpanoa, komponentit eivät voi määrittää, milloin on turvallista vapauttaa osa tästä käyttöliittymään liittyvästä muistista. Mutta perusviitemäärä, jota ylläpidetään erikseen kullekin liitännälle, voit päättää, milloin tämän muistin vapauttaminen on paljon helpompaa.
Guize
oikean käytön viite, jossa lasketaan kolme yksinkertaista sääntöä
1. Tiaoyong AddRef ennen paluuta. Niille funktioille, jotka rakentavat paremmin, palauttaa käyttöliittymäosoittimen ennen palauttamista vastaavan osoittimen tulee kutsua AddRef. Näitä toimintoja ovat QueryInterface ja CreateInstance. Niin, että kun asiakas saanut tällaisen käyttöliittymän toiminto. Sen ei tarvitse kutsua AddRefiä.
2. Käyttöliittymän käytön jälkeen Release-puhelun jälkeen. Käyttöliittymän käytön jälkeen pitäisi kutsua jotain Release-funktion käyttöliittymää.
3. Soita AddRefille toimeksiannon jälkeen. Kun toiselle liitäntäosoittimelle määritetyn liitäntäosoittimen pitäisi kutsua AddRef. Toisin sanoen, sen jälkeen kun on muodostettu viittaus rajapinnan ulkopuolelle, ei pitäisi lisätä vastaavan komponentin viitemäärää.
Liitäntä
asiakasnäkymässä viitemäärä on liittymätasolla eikä komponenttitasolla. Mutta toteutuksen näkökulmasta, jonka viitemäärä kirjataan käytännössä mitään yhteyttä. Asiakkaat voivat uskoa, että suora komponentti tallentaa jokaisen käyttöliittymän itse ylläpitää viitemäärää. Mutta asiakas ei voi olettaa, että koko kokoonpano säilyttää yhden viitemäärän.
Asiakkaille kukin käyttöliittymä on erikseen ylläpidetty viitemäärä, mikä tarkoittaa, että asiakkaiden tulee soittaa AddRef, jotta osoitinta käytetään muiden osoittimien sijasta. Asiakkaiden tulee viitata julkaisuun.
valitse säilyttää erillinen viittaus jokaiseen käyttöliittymän määrään koko kokoonpanon ylläpidon syiden viitemäärän sijaan:
helpottaa virheenkorjausta; vaatia tukiresurssien saatavuutta; < / p>
käyttöönotto
voidaan saavuttaa lisäämällä tai vähentämällä luvun arvoa.
Huomaa myös, että AddRef ja Release palautusarvolla ei ole järkeä, mutta siitä voi olla hyötyä ohjelman virheenkorjauksessa. Asiakkaiden ei pitäisi käyttää tätä arvoa, koska tämä on tarkka viittaus komponentin tai liitännän numeroon.
säännöt
asiakasrajapinnat on käsiteltävä, koska viitemäärä jokaiselle rajapinnalle on erillinen. Asiakkaiden tulee siksi laskea eri liitäntöjen viitemäärä erikseen, vaikka niiden käyttöikä on sisäkkäinen.
a, lähtöparametrin sääntö
tarkoittaa, että lähtöparametrit funktion kutsujalle palauttavat funktioparametrin arvon. Kello yhdestä alkaen lähtöparametrin palautusarvo on vaikutukseltaan samanlainen kuin sama funktio. Kaikkien tulosparametrien, jotka palautetaan palautusarvona tai osoittimena jonkin funktion uuteen käyttöliittymään, on oltava AddRer-liitäntäosoittimia.
Toiseksi säännön syöttöparametrit
käyttöliittymän osoitin välitetään funktiolle kutsumatta AddRef ja Release, tämä johtuu siitä, että sisäkkäisen funktion käyttöikä soittajan eliniässä.
Kolmanneksi tulo-lähtöparametrisääntö
Input - Lähtöparametrit sekä funktion tulo- että lähtöparametrit. Toimintoa voidaan käyttää muissa tulo-lähtöparametriarvoissa, sitten näitä arvoja voidaan muokata ja palauttaa ne soittajalle.
funktiossa liitäntäosoittimessa välitetyt tulo-lähtöparametrit, sen on kutsuttava Release ennen kuin se voi määrittää sen toiselle liitännän osoittimen arvolle. Ennen kuin funktio palaa, sinun on kutsuttava liitäntäosoittimeen tallennetut AddRef-lähtöparametrit.
Neljänneksi paikallisten muuttujien säännöt
Ajankohtaisille kotitekoisille käyttöliittymäosoittimille, mutta vain siksi, että ne ovat sen käyttöiän aikana, eikä siksi tarvitse kutsua AddRefiä ja Releasea. Tämä sääntö on itse asiassa suora seuraus säännön syöttöparametreista. Seuraavassa esimerkissä pIX2 vain funktiossa foo lifetime, jolloin varmistetaan, että sen elinikä on sisäkkäinen saapuvan pIX-osoittimen käyttöiän aikana, ei tarvitse kutsua AddRef- ja Release of pIX2 -toimintoa.
viisi yleisten muuttujien sääntöä
globaaliin muuttujaan tallennettuun käyttöliittymäosoittimeen, ennen kuin se välitetään toiselle funktiolle, sen on kutsuttava AddRef. Koska tämä muuttuja on globaali, mitä tahansa funktiota voidaan käyttää niiden elinkaaren päättämiseen kutsumalla sen Release. Jäsenmuuttujaan tallennetun rajapintaosoittimen osalta sitä tulee myös käsitellä tällä tavalla. Koska kaikki tämän luokan jäsentoiminnot ovat, liitäntäosoittimen tila voidaan muuttaa.
Kuusi sääntöä
Kun ei voida määrittää epävarmassa tilanteessa, tulee kutsua AddRef ja Release oikealle.
Lisäksi, kun määritetään, että se on optimoitava, ei pitäisi olla viitteitä vastaaviin kommentteihin viittaavia osoittimia tai muita ohjelmoijia muokkaamassa koodia, se voi pidentää käyttöliittymän osoittimen käyttöikää ja sulkea siten viitemäärän optimoinnin. tuhottu.
Virhe unohda soittaa Vapauta syy voi olla vaikeampi havaita kuin olla kutsumatta AddRef. Suurin etu verrattuna Roskakeräyksen seurantaan
edut ja puutteet
, kohteen viitelukumäärä ei ole enää käytössä voidaan palauttaa mahdollisimman pian, samalla ei aiheuta palautusprosessiin pitkää taukoa, myös selvästi merkitty kunkin esineen elinkaaren aikana.
reaaliaikaisissa sovelluksissa tai muistirajoitteisissa järjestelmissä reaaliaikainen reagointikyky on tärkeä indikaattori, ja viiteluku on yksi helpoimmin toteutettavista roskienkeruusta, se sopii tapaukseen. Viitemäärää voidaan käyttää myös muiden ei-muistiresurssien, kuten käyttöjärjestelmäobjektin, hallintaan (usein vähemmän kuin muistiresurssit). Jätekeräyksen seurantatekniikka käsitellä tällaista kohdetta terminaattorilla, mutta viivästynyt palautus voi johtaa muihin ongelmiin. Painotusta sovelletaan viitemäärästä johdettuihin taidehajautettuihin järjestelmiin.
käytettävissä olevalla muistilla on täytetty aktiivisella kohdealustalla, roskien keräämisen seuranta käynnistyy usein, mikä heikentää suorituskykyä. Viitemäärä myös silloin, kun muisti on ehtymisen partaalla, suorituskyky on silti turvattu. Viitemäärä myös muille optimointitekniikoille ajonaikaisen viiteinformaation tarjoamiseksi, esimerkiksi monet järjestelmät muuttumattomille objekteille (esim. toiminnallinen ohjelmointikieli), suuri määrä kaksoiskappaleita voi johtaa vakavaan suorituskykyyn; tällaisessa järjestelmässä tyypillisiä optimointitoimenpiteitä ovat: tulevaisuus, jos objekti luodaan vain kerran, ja samaan aikaan luodaan toinen samanlainen objekti, siihen ei enää viitata (kuten Javascriptin merkkijonojen yhdistämisoperaattori), voit poistaa alkuperäinen objekti luo uuden objektin käyttäytyminen muuttuu muokata alkuperäistä kohdetta, mikä parantaa tehokkuutta. Vertailumäärä voi tarjota riittävästi vertailutietoa tällaiseen optimointiin.
optimoitu viiteluku ilman jälkiä verrattu Roskakeräyksellä on kaksi suurta haittaa, joten meidän on otettava käyttöön lisämekanismeja korjaamiseksi:
-
usein päivitettävä viitemäärä Se vähentää käyttötehoa.
-
alkuperäisen viitemäärän kiertoviittausongelmaa ei voida ratkaista. Tilallinen paikka
Lisäksi, jos vapaan listan muistivaraus, viitemäärä on erittäin huono. Käyttämällä vain viitemäärää suorittimen välimuistia suorituskyvyn parantamiseksi siirtämällä kohteita, korkean suorituskyvyn muistin allokaattori toteuttaa sekä seurantajätteenkeräimen suorituskyvyn parantamiseksi. Monien viitteiden laskennan toteutus (kuten PHP ja Objective-C) huono suorituskyky, koska he eivät ymmärtäneet muistikopiota.