Lenduv C++

Lenduv C



„Kasutajaruumi rakenduste arendajad peaksid alati viitama asjakohastele kompilaatorite juhenditele, et saada teada, kuidas kvalifikaatorit saab erinevates kontekstides käsitleda, kuna muutlikku märksõna käitumist tuleks tavaliselt vaadelda riistvarast sõltuvana. Kui objekt on märgitud muutlikuks, teatatakse kompilaatorile sageli, et seda ei tohiks kunagi laadimistoimingute jaoks optimeerida ja see tuleks alati tuua esmasest mälust, mitte registritest või vahemälust. Kui aga kompilaator üritab mäluasukohta registrisse lisada, salvestatakse see automaatselt vahemällu, kuigi on palju vahemälutasemeid, mis pole tarkvarale suures osas saadaval ja mida hoitakse ainult riistvaras. Selle tulemusel pääseb RAM-ile ligi mitu korda kiiremini CPU lähedal asuvate vahemäluliinide kaudu kui identsest mälukohast.

Probleemid võivad ilmneda, kui me ei kasuta muutlikku tähist, mis sisaldab, kui optimeerimine on lubatud, kood ei pruugi ootuspäraselt toimida. Kui katkestusi kasutatakse ja lubatakse, ei saa kood plaanipäraselt toimida. Andmeid säilitatakse lenduvas salvestusruumis ainult siis, kui toide on sisse lülitatud. Toiteallika eemaldamisel toimub andmete kadu.

Püsimälu säilitab aga andmed isegi siis, kui toide kaob. Protsessi teavet salvestatakse lühiajaliselt lenduvale salvestusruumile, kuna see on märkimisväärselt kiirem kui püsimälu. Erinevalt muutumatust salvestusruumist sobib lenduv salvestus tundlike andmete kaitsmiseks paremini. Põhjus on selles, et andmetele ei pääse juurde, kui toide on välja lülitatud. Muutuv salvestusruum maksab palju, sest arvutisüsteemid mahutavad sellest vaid mõne MB kuni mõne GB.







Lenduva kvalifikaatori omadused C++ keeles

Siin näidatakse C++ lenduvate kvalifikaatorite keskmisi. Kui deklareerime muutuja, rakendatakse tähist 'volatile'. See tuletab kompilaatorile meelde, et väärtus võib igal ajal muutuda. Lenduvatel inimestel on mõned allpool loetletud tunnused.



• Mälu määramist ei saa muutliku märksõnaga muuta.



• Registri muutujaid ei saa vahemällu salvestada.





• Määramise osas ei saa väärtust muuta.

Lenduva kvalifikaatori kasutamine C++ keeles

1. Kuigi teie kood ei muuda muutuja väärtust, võib see siiski seda teha. Seetõttu ei saa kompilaator iga kord muutuja olekut kontrollides eeldada, et see on sama, mis sellelt loetud kõige värskem väärtus või viimane salvestatud väärtus; pigem peab see uuesti omandama muutuja väärtuse.



2. Kompilaator ei pea väärtuse salvestamist kõrvaldama, kuna see on 'kõrvalmõju', mida võib näha väljastpoolt ja mis ilmneb siis, kui väärtus salvestatakse muutuvasse muutujasse. Näiteks kui kaks väärtust asetatakse ritta, peab kompilaator panema väärtuse kaks korda.

Lenduva kvalifikaatori süntaks C++ keeles

# Püsiva andmetüübi muutuja_nimi

Deklaratsioonis tuleb kasutada muutlikku märksõna ja andmetüüp viitab mis tahes andmetüübile, sealhulgas topelt-, ujuv- või täisarv. Lõpuks valime muutujale nime. Lenduva muutuja saab määratleda mõlema meetodi abil, kuna mõlemad deklaratsioonid on kehtivad.

Näide: lenduvat kvalifikaatorit kasutatakse objektide tuvastamiseks, mida saab C++-s muude lõimede või väliste toimingutega muuta

Kui objekti muudetakse välise signaali või katkestusena toimiva protseduuri tõttu, tuleb muudetud väärtus RAM-ist hankida, kuna vahepealne vahemällu olek pole enam sobiv. Selle tulemusena käsitleb kompilaator lenduvatele objektidele juurdepääsu asjakohaselt.

#include
#include
#include

kasutades std :: cout ;
kasutades std :: endl ;
kasutades std :: cerr ;
kasutades std :: söömine ;

muutlik int sekundit = 0 ;

tühine ViivitusFiveSeconds ( ) {
samal ajal ( sekundit < 3 ) {
magama ( 200 000 ) ;
cerr << 'ootan...' << endl ;
}
}

tühine InkrementSeconds ( ) {
jaoks ( int i = 0 ; i < 5 ; ++ i ) {
magama ( 1 ) ;
cerr << 'kasvatatud' << endl ;
sekundit = sekundit + 1 ;
}
}

int peamine ( ) {
struktuur ajaline algus { } ;
struktuur ajaline lõpp { } ;
std :: niit niit1 ;

niit1 = std :: niit ( InkrementSeconds ) ;

ViivitusFiveSeconds ( ) ;

niit1. liituda ( ) ;
tagasi EXIT_SUCCESS ;
}


Potentsiaalse stsenaariumi illustreerimiseks oleme kasutanud muutlikku märksõna, mille muutuja on deklareeritud sekundites andmetüübiga 'int' ja määranud sellele väärtuse 0. Seejärel konstrueerime kaks funktsiooni: ühe funktsioonina 'DelayFiveSeconds', mis muudab globaalset lenduvat täisarvu muutujat, ja teise funktsiooni 'IncrementSeconds', mis teostab samas tsüklis sama hinnangu. Tuleb märkida, et see näide lubab, et while-tsükkel on tsükliliselt üle sekundite, kui sekundid peaksid olema väiksemad kui 3.

Kui tingimus on täidetud, käivitatakse while-plokk. Kuigi ploki sees oleme käivitanud unsleep meetodi, mis prindib lause 'ootab'. Funktsioonil 'IncrementSceonds' on for-silmus. Pärast iteratsiooni käivitatakse unerežiim, mis prindib lause 'increment' ja suurendab muutujat 'seconds'. Funktsiooni 'IncrementSeconds' esialgne täitmine toimub põhifunktsiooni loodud eraldi lõime kaudu. Seejärel kutsub põhilõime meetodit 'DelayFiveSeconds', sisestades tsükli, mis ei lõpe, kui sekundimuutuja ei liigu väärtusest 5 kõrgemale.

Niipea, kui põhilõim märkab, et sekundimuutuja väärtus on muutunud, naaseb see meetodist, kuna teine ​​lõim on seda samaaegselt juba suurendama hakanud.

Lõimekoodi käivitamiseks C++-s peaksime kasutama käsku “g++ -pthread –o failinimi failinimi.cc”. Kui te ei juuruta käsus '-pthread', on võimalus, et kompilaator teeb erandi. Selle tulemusena tegime tõhusalt tingimusliku ootefunktsiooni, mis ootab, kuni lenduvat objekti välisjõud muudab. Oluline on meeles pidada, et värskenduskoodiplokk võib pärineda teisest tõlkeosast või välisest signaalitoimingust, kuigi see kood töötab endiselt samamoodi, kui muutlik kvalifikaator eemaldatakse ja kasutatakse tavalist globaalset muutujat.

Järeldus

Siin anname ülevaate Volatile'ist C++ keeles koos süntaksi, kasutamise ja sobivate näidetega, et paremini mõista. Kuna kompilaator ei saa väärtust ennustada, on lenduv C-programmeerimisel ülioluline. Volatile'i kasutamise peamine eelis on see, et selle väärtus võib muutuda, kui kasutaja taotleb selle muutmist või kui mõni muu sama muutujat kasutav lõim on aktiivne.