Nepastovus C++

Nepastovus C



„Vartotojo erdvės programų kūrėjai visada turėtų remtis atitinkamomis kompiliatoriaus žinynais, kad sužinotų, kaip kvalifikatorius gali būti tvarkomas įvairiuose kontekstuose, nes kintamo raktinio žodžio elgesys paprastai turėtų būti vertinamas kaip priklausomas nuo aparatinės įrangos. Kai objektas pažymimas kaip nepastovus, kompiliatorius dažnai informuojamas, kad jis niekada neturėtų būti optimizuotas įkėlimo operacijoms ir visada turėtų būti nuskaitytas iš pirminės atminties, o ne iš registrų ar talpyklų. Tačiau kai kompiliatorius bando įrašyti atminties vietą į registrą, jis automatiškai įrašomas į talpyklą, nors yra daugybė talpyklų, kurių programinė įranga iš esmės nepasiekia ir kurios palaikomos tik aparatinėje įrangoje, talpykloje. Dėl to RAM galima pasiekti daug kartų greičiau iš talpyklos linijų, esančių šalia procesoriaus, nei iš identiškos atminties vietos.

Problemos gali kilti, jei nenaudosime nepastovaus kvalifikatoriaus, kuris apima, kai optimizavimas įgalintas, kodas gali neveikti taip, kaip tikėtasi. Kai naudojami ir įjungiami pertraukimai, kodas negali veikti taip, kaip planuota. Duomenys saugomi nepastovioje saugykloje tik tada, kai įjungtas maitinimas. Pašalinus tiekimą, prarandami duomenys.

Tačiau nepastovioje saugykloje duomenys išsaugomi, net jei dingsta maitinimas. Proceso informacija trumpai saugoma nepastovioje saugykloje, nes ji yra daug greitesnė nei nepastovioji saugykla. Skirtingai nuo nepastovios saugyklos, nepastovi saugykla yra tinkamesnė slaptiems duomenims apsaugoti. Taip yra todėl, kad išjungus maitinimą duomenys nepasiekiami. Nepastovi saugykla kainuoja daug, nes kompiuterinės sistemos gali talpinti tik nuo kelių MB iki kelių GB.







Lakiojo kvalifikatoriaus ypatybės C++

Čia bus parodytos C++ nepastovios kvalifikacinės priemonės. Kai deklaruojame kintamąjį, taikomas kvalifikatorius „volatile“. Jis naudojamas kaip priminimas kompiliatoriui, kad vertė gali bet kada kisti. Nepastoviosios turi kai kurias toliau išvardytas savybes.



• Atminties priskyrimo negalima pakeisti naudojant nepastovų raktinį žodį.



• Registro kintamieji negali būti talpinami.





• Kalbant apie priskyrimą, vertės keisti negalima.

Lakiojo kvalifikatoriaus naudojimas C++

1. Nepaisant to, kad jūsų kodas nekeičia kintamojo vertės, jis vis tiek gali tai padaryti. Dėl to kiekvieną kartą, kai kompiliatorius tikrina kintamojo būseną, jis negali daryti prielaidos, kad ji sutampa su naujausia iš jo nuskaityta ar paskutine saugoma verte; veikiau turi dar kartą įgyti kintamojo reikšmę.



2. Kompiliatorius neprivalo panaikinti reikšmės saugojimo veiksmo, nes tai yra „šalutinis poveikis“, kuris gali būti matomas iš išorės ir atsiranda, kai reikšmė išsaugoma nepastoviame kintamajame. Pavyzdžiui, jei dvi reikšmės dedamos į eilutę, kompiliatorius turi įvesti reikšmę du kartus.

Lakiojo kvalifikatoriaus sintaksė C++ kalboje

# Nepastovus duomenų_tipo kintamojo_pavadinimas

Deklaracijoje turi būti naudojamas nepastovus raktinis žodis, o duomenų tipas nurodo bet kokį duomenų tipą, įskaitant dvigubą, slankiojantį arba sveikąjį skaičių. Galiausiai pasirenkame kintamojo pavadinimą. Nekintamąjį kintamąjį galime apibrėžti naudodami bet kurį iš metodų, nes abi deklaracijos galioja.

Pavyzdys: nepastovus kvalifikatorius naudojamas objektams, kuriuos gali modifikuoti kitos gijos arba išoriniai veiksmai C++ programoje, identifikuoti.

Jei objektą pakeičia išorinis signalas arba procedūra, kuri veikia kaip pertraukimas, pakeistą reikšmę reikia gauti iš RAM, nes talpyklos būsena tuo tarpu nebetinkama. Dėl to kompiliatorius tinkamai tvarko prieigą prie nepastovių objektų.

#include
#include
#include

naudojant std :: cout ;
naudojant std :: endl ;
naudojant std :: cerr ;
naudojant std :: valgymas ;

nepastovios tarpt sekundžių = 0 ;

tuštuma VėlavimasFiveSeconds ( ) {
kol ( sekundžių < 3 ) {
miegoti ( 200 000 ) ;
cerr << 'laukiu...' << endl ;
}
}

tuštuma IncrementSeconds ( ) {
dėl ( tarpt i = 0 ; i < 5 ; ++ i ) {
miegoti ( 1 ) ;
cerr << 'padidintas' << endl ;
sekundžių = sekundžių + 1 ;
}
}

tarpt pagrindinis ( ) {
struktūra laiko pradžia { } ;
struktūra laiko pabaiga { } ;
std :: siūlas siūlas1 ;

siūlas1 = std :: siūlas ( IncrementSeconds ) ;

VėlavimasFiveSeconds ( ) ;

siūlas1. prisijungti ( ) ;
grąžinti EXIT_SUCCESS ;
}


Siekdami iliustruoti galimą scenarijų, panaudojome nepastovų raktinį žodį, kurio kintamasis deklaruojamas kaip sekundės duomenų tipo „int“, ir jam priskyrėme 0 reikšmę. Tada sukuriame dvi funkcijas: vieną kaip „DelayFiveSeconds“, kuri pakeičia visuotinį nepastovų sveikųjų skaičių kintamąjį, ir kitą kaip „IncrementSeconds“, kuri atlieka tą patį įvertinimą while ciklo viduje. Reikėtų pažymėti, kad šiame pavyzdyje sekundės, kai sekundės turėtų būti mažesnės nei 3, gali būti ciklo while ciklas.

Kai sąlyga bus įvykdyta, bus vykdomas while blokas. Nors bloko viduje mes panaudojome unsleep metodą, kuris išspausdina teiginį „laukia“. Funkcija „IncrementSceonds“ turi for kilpą. Po iteracijos iškviečiamas miego metodas, kuris išspausdina teiginį „increment“ ir padidina „sekundės“ kintamąjį. Pradinis funkcijos „IncrementSeconds“ vykdymas atliekamas naudojant atskirą giją, kurią sukuria pagrindinė funkcija. Tada pagrindinė gija iškviečia „DelayFiveSeconds“ metodą, įvesdama kilpą, kuri nesibaigs, jei sekundžių kintamasis nepajudės virš 5 vertės.

Kai tik pagrindinė gija pastebės, kad pasikeitė sekundžių kintamojo reikšmė, ji grįš iš metodo, nes kita gija jau pradėjo ją didinti tuo pačiu metu.

Norėdami paleisti gijos kodą C++, turėtume naudoti komandą „g++ -pthread –o failo pavadinimas failo pavadinimas.cc“. Jei komandoje neįdiegsite „-pthread“, yra tikimybė, kad kompiliatorius padarys išimtį. Dėl to mes efektyviai sukūrėme sąlyginio laukimo funkciją, kuri laukia, kol nepastovų objektą pakeis išorinė jėga. Svarbu nepamiršti, kad naujinimo kodo blokas gali būti gautas iš kitos vertimo dalies arba išorinio signalo veiksmo, nors šis kodas vis tiek veiks taip pat, jei bus pašalintas nepastovus kvalifikatorius ir naudojamas įprastas visuotinis kintamasis.

Išvada

Čia apžvelgsime „Volatile“ C++ kalboje, sintaksę, naudojimą ir atitinkamus pavyzdžius, kad geriau suprastume. Kadangi kompiliatorius negali numatyti vertės, nepastovumas yra labai svarbus programuojant C. Pagrindinis nepastoviojo naudojimo pranašumas yra tas, kad jo vertė gali skirtis, kai naudotojas prašo jį modifikuoti arba kai yra aktyvi kita gija, naudojanti tą patį kintamąjį.