Haihtuva C++

Haihtuva C



'Käyttäjäavaruussovellusten kehittäjien tulee aina viitata asiaankuuluviin kääntäjien käsikirjoihin saadakseen tietää, kuinka tarkennetta voidaan käsitellä eri yhteyksissä, koska haihtuvien avainsanojen käyttäytymistä tulisi yleensä pitää laitteistoriippuvaisena. Kun objekti on merkitty haihtuvaksi, kääntäjälle ilmoitetaan usein, että sitä ei koskaan pidä optimoida lataustoimintoja varten ja että se tulee aina hakea ensisijaisesta muistista rekistereiden tai välimuistien sijaan. Kuitenkin, kun kääntäjä yrittää sijoittaa muistipaikan rekisteriin, se tallentuu automaattisesti välimuistiin, vaikka on lukuisia välimuistitasoja, jotka eivät ole suurelta osin ohjelmistojen käytettävissä ja joita ylläpidetään vain laitteistossa. Tämän seurauksena RAM-muistia voidaan käyttää monta kertaa nopeammin prosessorin lähellä olevilta välimuistilinjoilta kuin samasta muistipaikasta.

Ongelmia saattaa ilmetä, jos emme käytä haihtuvaa tarkennetta, joka sisältää, kun optimointi on käytössä, koodi ei ehkä toimi odotetulla tavalla. Kun keskeytyksiä käytetään ja otetaan käyttöön, koodi ei voi toimia suunnitellusti. Tietoja säilytetään haihtuvassa tallennustilassa vain, kun virta on päällä. Kun lähde poistetaan, tietoja katoaa.

Haihtumaton tallennus kuitenkin säilyttää tiedot, vaikka virta katkeaa. Prosessitiedot tallennetaan hetkeksi haihtuvaan tallennustilaan, koska se on huomattavasti nopeampi kuin haihtumaton tallennus. Toisin kuin haihtumaton tallennus, haihtuva tallennus soveltuu paremmin arkaluonteisten tietojen suojaamiseen. Tämä johtuu siitä, että tietoihin ei pääse käsiksi, kun virta on katkaistu. Haihtuva tallennus maksaa paljon, koska tietokonejärjestelmiin mahtuu sitä vain muutamasta megatavuun muutamaan gigatavuun.'







Haihtuvan tarkenteen ominaisuudet C++:ssa

C++ haihtuvien tarkenteiden keskiarvot esitellään tässä. Kun ilmoitamme muuttujan, käytetään tarkennetta 'volatile'. Se toimii muistutuksena kääntäjälle, että arvo saattaa vaihdella milloin tahansa. Haihtuvilla henkilöillä on jotkin alla luetellut ominaisuudet.



• Muistin määritystä ei voi muuttaa haihtuvalla avainsanalla.



• Rekisterin muuttujia ei voi tallentaa välimuistiin.





• Määrityksen osalta arvoa ei voi muuttaa.

Volatile Qualifierin käyttö C++:ssa

1. Vaikka koodisi ei muuta muuttujan arvoa, se saattaa kuitenkin tehdä niin. Tämän seurauksena joka kerta kun kääntäjä tarkistaa muuttujan tilan, se ei voi olettaa, että se on sama kuin viimeisin siitä luettu arvo tai viimeisin tallennettu arvo; sen sijaan sen on hankittava muuttujan arvo vielä kerran.



2. Kääntäjän ei tarvitse eliminoida arvon tallentamista, koska se on 'sivuvaikutus', joka voidaan nähdä ulkopuolelta ja joka ilmenee, kun arvo tallennetaan haihtuvaan muuttujaan. Jos esimerkiksi kaksi arvoa sijoitetaan riville, kääntäjän on asetettava arvo kahdesti.

Haihtuvan tarkenteen syntaksi C++:ssa

# Haihtuva tietotyyppi muuttujan_nimi

Haihtuvaa avainsanaa on käytettävä ilmoituksessa, ja tietotyyppi viittaa mihin tahansa tietotyyppiin, mukaan lukien double, float tai kokonaisluku. Lopuksi valitsemme muuttujalle nimen. Voimme määrittää haihtuvan muuttujan käyttämällä jompaakumpaa menetelmää, koska molemmat ilmoitukset ovat kelvollisia.

Esimerkki: Haihtuvaa tarkennetta käytetään tunnistamaan objektit, joita voidaan muokata muilla säikeillä tai ulkoisilla toimilla C++:ssa

Jos objektia muuttaa ulkoinen signaali tai keskeytyksenä toimiva proseduuri, muutettu arvo on haettava RAM:sta, koska välimuistitila ei sillä välin ole enää sopiva. Tämän seurauksena kääntäjä käsittelee pääsyn haihtuviin objekteihin asianmukaisesti.

#include
#include
#sisällytä

käyttämällä std :: cout ;
käyttämällä std :: endl ;
käyttämällä std :: cerr ;
käyttämällä std :: syöminen ;

haihtuvia int sekuntia = 0 ;

mitätön ViiveFiveSeconds ( ) {
sillä aikaa ( sekuntia < 3 ) {
sinä nukut ( 200 000 ) ;
cerr << 'odotetaan...' << endl ;
}
}

mitätön IncrementSeconds ( ) {
varten ( int i = 0 ; i < 5 ; ++ i ) {
nukkua ( 1 ) ;
cerr << 'lisätty' << endl ;
sekuntia = sekuntia + 1 ;
}
}

int pää ( ) {
struct aikallinen aloitus { } ;
struct ajan loppu { } ;
std :: lanka lanka 1 ;

lanka 1 = std :: lanka ( IncrementSeconds ) ;

ViiveFiveSeconds ( ) ;

lanka 1. liittyä seuraan ( ) ;
palata EXIT_SUCCESS ;
}


Mahdollisen skenaarion havainnollistamiseksi olemme käyttäneet haihtuvaa avainsanaa, jonka muuttuja on ilmoitettu sekunniksi tietotyyppiä 'int' ja antanut sille arvon 0. Sitten rakennamme kaksi funktiota: yksi 'DelayFiveSeconds', joka muuttaa globaalia haihtuvaa kokonaislukumuuttujaa, ja toinen 'IncrementSeconds', joka suorittaa saman arvioinnin while-silmukan sisällä. On huomattava, että tämä esimerkki sallii while-silmukan kiertämisen sekuntien yli, kun sekuntien tulisi olla alle 3.

Kun ehto täyttyy, while-lohko suoritetaan. While-lohkon sisällä olemme käyttäneet unsleep-menetelmää, joka tulostaa lausunnon 'waiting'. 'IncrementSceonds'-funktiossa on for-silmukka. Iteroinnin jälkeen käynnistetään unimenetelmä, joka tulostaa käskyn 'increment' ja lisää 'sekuntia' muuttujaa. 'IncrementSeconds'-toiminnon ensimmäinen suoritus suoritetaan päätoiminnon luomalla erillisellä säikeellä. Pääsäie kutsuu sitten 'DelayFiveSeconds' -menetelmää ja syöttää silmukan, joka ei pääty, jos sekuntimuuttuja ei siirry arvon 5 yläpuolelle.

Heti kun pääsäie huomaa sekuntimuuttujan arvon muuttuneen, se palaa menetelmästä, koska toinen säie on jo alkanut kasvattaa sitä samanaikaisesti.

Säikeen koodin suorittamiseksi C++:ssa meidän tulee käyttää komentoa 'g++ -pthread -o tiedostonimi tiedostonimi.cc'. Jos et ota käyttöön komentoa '-pthread', kääntäjä saattaa tehdä poikkeuksen. Tämän seurauksena teimme tehokkaasti ehdollisen odotustoiminnon, joka odottaa, kunnes haihtuva kohde muuttuu ulkopuolisen voiman vaikutuksesta. On tärkeää pitää mielessä, että päivityskoodilohko voi tulla eri käännösosasta tai ulkoisesta signaalitoiminnosta, vaikka tämä koodi toimii edelleen samoin, jos haihtuva tarkenne poistetaan ja käytetään tavallista globaalia muuttujaa.

Johtopäätös

Tässä käymme läpi yleiskatsauksen Volatilesta C++:ssa, syntaksin, käytön ja asianmukaisia ​​esimerkkejä ymmärtääksemme paremmin. Koska kääntäjä ei voi ennustaa arvoa, haihtuvuus on ratkaisevan tärkeää C-ohjelmoinnissa. Haihtuvan käytön ensisijainen etu on, että sen arvo voi vaihdella aina, kun käyttäjä pyytää sen muokkausta tai kun jokin muu samaa muuttujaa käyttävä säie on aktiivinen.