C ++

Objekto tarnavimo laikas ir saugojimo trukmė C ++

Objekto tarnavimo laikas ir saugojimo trukmė C ++
Kuriant objektą, prieš inicializuojant, reikia nustatyti jo vietą atmintyje. Inicijavimas reiškia vertės pridėjimą į vietą. Objekto gyvavimo laikas prasideda iškart po inicializavimo. Kai objektas miršta, atleidžiama jo vieta (saugykla), kurioje užimtas objektas, o tada kompiuteris išjungiamas arba saugyklą užima (naudoja) kitas objektas. Atlaisvinus saugyklą, identifikatorius ar žymeklis, užėmęs saugyklą, tampa negaliojantis. Objekto gyvavimo laikas baigiasi, kai atleidžiama jo saugykla.

Objektui sukurti reikia šiek tiek laiko. Norint užmušti daiktą reikia šiek tiek laiko. Kalbant apie objektą, yra susiję du dalykai: vieta, kuri yra saugykla, ir vertė. Gyvenimo trukmė ir laikymo trukmė yra panašios; bet trukmė labiau matoma iš vietos, o ne iš taško. Saugojimo trukmė yra laikas nuo vietos susiejimo su objektu iki momento, kai vieta yra atskirta nuo objekto.

Likusi šio straipsnio dalis iliustruoja objekto tarnavimo laiką ir trumpai paaiškina skirtingas laikymo trukmes. Norėdami suprasti šį straipsnį, turėtumėte turėti pagrindinių žinių C ++ kalba. Jūs taip pat turėtumėte turėti žinių apie C ++ taikymo sritį.

Straipsnio turinys

Objekto gyvavimo iliustracija

Apsvarstykite šią programą:

# įtraukti
naudojant vardų sritį std;
int main ()

jei (1 == 1)

int x;
x = 1;
char y;
y = 'A';
cout << x << y << '\n';

grąžinti 0;

Išėjimas yra 1A .

Objekto gyvenimas baigiasi, kai jis išeina iš taikymo srities. Objekto x gyvenimo trukmė prasideda nuo „x = 1;“ ir baigiasi „if-local“ srities pabaigoje. Objekto y gyvenimo trukmė prasideda nuo „y =„ A “;“ ir baigiasi „if-local“ srities pabaigoje. Prieš mirus abiem objektams, jie yra naudojami ataskaitoje .

Laikymo trukmė

Saugojimo trukmė nustatoma pagal vieną iš šių schemų: automatinio saugojimo trukmė; dinaminės saugojimo trukmė; statinio laikymo trukmė; siūlų laikymo trukmė. Saugojimo trukmės kategorijos taip pat taikomos nuorodoms.

Automatinė saugojimo trukmė

Jei kintamasis nėra aiškiai deklaruojamas kaip statinis, thread_local ar extern, tai kintamasis turi automatinę saugojimo trukmę. Pavyzdžiai yra aukščiau x ir y. Tokių kintamųjų trukmė baigiasi, kai jie išeina iš taikymo srities. Ši programa iliustruoja automatinę nuorodos ir žymeklio saugojimo trukmę pasauliniu mastu.

# įtraukti
naudojant vardų sritį std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()

cout << m << *n << '\n';
grąžinti 0;

Išėjimas yra 1A .

M trukmė prasideda nuo „int & m = x;“ ir baigiasi programos pabaigoje. N trukmė prasideda nuo „char * n = & y;“ ir baigiasi programos pabaigoje.

Dinaminė saugojimo trukmė

Nemokama parduotuvė

Šiuolaikiniame kompiuteryje vienu metu gali veikti daugiau nei viena programa. Kiekviena programa turi savo atminties dalį. Likusi atminties dalis, kurios nenaudoja jokia programa, yra žinoma kaip nemokama parduotuvė. Ši išraiška naudojama norint grąžinti sveiko skaičiaus vietą iš nemokamos parduotuvės

naujas tarpt

Ši grąžinto sveikojo skaičiaus vieta (saugykla) vis tiek turi būti nustatyta priskyrus žymeklį. Šis kodas parodo, kaip naudoti žymeklį su nemokama parduotuve:

int * ptrInt = naujas int;
* ptrInt = 12;
cout<< *ptrInt <<'\n';

Išvestis yra 12 .

Norėdami nutraukti objekto gyvenimą, naudokite ištrynimo išraišką taip:

ištrinti ptrInt;

Išraiškos argumentas yra rodyklė. Šis kodas iliustruoja jo naudojimą:

int * ptrInt = naujas int;
* ptrInt = 12;
ištrinti ptrInt;

Rodyklė, sukurta naudojant naują išraišką ir ištrinta kartu su ištrinimo išraiška, yra dinaminės saugyklos trukmė. Šis žymeklis miršta, kai išeina iš taikymo srities, arba yra ištrintas. Objekto, esančio ankstesniame kode, trukmė prasideda „* ptrInt = 12;“ ir baigiasi deklaratyvaus regiono pabaigoje (taikymo sritis). Naujų ir ištrintų posakių yra daugiau nei čia aptarta - žr. Vėliau.

Statinė laikymo trukmė

Statinis objektas

Objektas, paskelbtas statiniu, elgiasi kaip įprastas objektas, išskyrus tai, kad jo saugojimo trukmė prasideda nuo jo inicijavimo iki programos pabaigos. Jo negalima pamatyti už jo taikymo srities ribų, tačiau jis gali būti naudojamas netiesiogiai ir už jos ribų.

Apsvarstykite šią programą, kuri turėtų būti skaičiuojama nuo 1 iki 5 (netestuokite programos):

# įtraukti
naudojant vardų sritį std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
jei (stc> 5)
grąžinti 0;
fn ();

int main ()

fn ();
grąžinti 0;

Rezultatas yra 1 1 1 1 1 1 1 1 1 ... ir niekada nesibaigiantis. Funkcijos apibrėžimas yra pasikartojanti funkcija; reiškia, jis vis save vadina, kol įvykdoma sąlyga.

Išeitis yra padaryti stc objektą statinį. Inicializavus statinį objektą, jo vertė negali būti pakeista, kol programa nesibaigs. Ši programa (kurią galite išbandyti), kuri yra tokia pati kaip pirmiau, bet dabar su stc padaryta statine, skaičiuojama nuo 1 iki 5:

# įtraukti
naudojant vardų sritį std;
int fn ()

statinis int stc = 1;
cout << " << stc;
stc = stc + 1;
jei (stc> 5)
grąžinti 0;
fn ();

int main ()

fn ();
grąžinti 0;

Išvestis yra: 1 2 3 4 5 .

Pastaba: Statinio objekto trukmė prasideda, kai objektas yra inicializuotas, ir baigiasi programos pabaigoje. Tuo tarpu objektą galima naudoti netiesiogiai, iš kitos apimties. Inicializavus statinį objektą, jo pradinė vertė negali būti pakeista, net jei jo apibrėžimas yra iš naujo įvertintas. Ankstesniame kode stc nėra iš naujo nustatytas, kai kitą kartą jis bus vadinamas. Kitą kartą, kai jis bus vadinamas, jis bus padidintas „stc = stc + 1;“.

Statinių duomenų narys

Susijusių kintamųjų ir funkcijų rinkinį galima įdėti į apibendrintą vienetą, vadinamą klase. Jei kintamiesiems suteikiamos tam tikros vertės, klasė tampa objektu. Tačiau objektas nėra sukurtas tiesiog priskiriant reikšmes kintamajam. Klasė yra momentinė, norint gauti objektą; ir kiekvienas sukurtas objektas turi savo pavadinimą, kuris skiriasi nuo kitų tos pačios klasės objektų. Ši programa rodo klasę, vadinamą TheCla, ir objektą, vadinamą obj; ji taip pat parodo, kaip objektas yra eksponuojamas ir naudojamas pagrindinėje () funkcijoje:

# įtraukti
naudojant vardų sritį std;
klasė „TheCla“

vieša:
int num;
negaliojantis func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

TheCla obj;
obj.skaičius = 12;
obj.func ('$', "500");
grąžinti 0;

Rezultatas yra:

Parduotuvėje yra 12 knygų, kurių vertė 500 USD.

Atkreipkite dėmesį, kad norint priskirti kintamajam numeriui 12 reikšmę, objektas turi būti išaiškintas prieš įvykstant priskyrimui. Programuotojui įmanoma priskirti vertę neišskiriant (nesukuriant) objekto. Norėdami tai pasiekti, kintamasis num turės būti deklaruotas kaip statinis. Tada jis bus pasiekiamas kaip „TheCla :: num“ be objekto pavadinimo, bet su klasės pavadinimu. Tai iliustruoja ši programa:

# įtraukti
naudojant vardų sritį std;
klasė „TheCla“

vieša:
statinis konst int skaičius = 12;
negaliojantis func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

cout << TheCla::num << '\n';
TheCla obj;
obj.func ('$', "500");
grąžinti 0;

Rezultatas yra:

12
Parduotuvėje yra 12 knygų, kurių vertė 500 USD.

Atminkite, kad norint pasiekti duomenų narį, reikėjo naudoti numerį main in (), srities skiriamosios gebos operatorių ::. Taip pat ne tai, kad kintamasis num turėjo būti pastovus ir inicializuotas klasės aprašyme (apibrėžimas).

Statinė nario funkcija

Atkreipkite dėmesį, kad ankstesniame aukščiau pateiktame programos sąraše, norint naudoti funkciją „func“ pagrindiniame (), objektas turėjo būti iš karto. Programuotojui įmanoma iškviesti funkciją, neišskiriant (nesukuriant) objekto. Norint tai pasiekti, prieš funkcijos apibrėžimą reikia įvesti žodį „statinis“. Tada jis bus pasiekiamas kaip „TheCla :: func ()“ be objekto pavadinimo, bet su klasės pavadinimu. Ši programa tai parodo statinių duomenų nario ir statinio nario funkcijoms:

# įtraukti
naudojant vardų sritį std;
klasė „TheCla“

vieša:
statinis konst int skaičius = 12;
statinis tuštumas func (char cha, const char * str)

cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';

;
int main ()

„TheCla :: func“ („$“, „500“);
grąžinti 0;

Rezultatas yra:

Parduotuvėje yra 12 knygų, kurių vertė 500 USD.

Siūlų laikymo trukmė

G ++ kompiliatorius dar neįdiegė gijos kaip C ++ funkcijos. Taigi, užuot paaiškinus tai, citata iš C ++ specifikacijos pateikiama taip:

  1. Visiems kintamiesiems, deklaruojamiems „thread_local“ raktiniu žodžiu, yra gijos saugojimo trukmė. Šių subjektų saugykla tęsis visą gijos, kurioje jie sukurti, trukmę. Kiekvienoje gijoje yra atskiras objektas arba nuoroda, o deklaruoto vardo naudojimas reiškia objektą, susietą su dabartine gija.
  2. Kintamasis su sriegio laikymo trukme turi būti inicializuotas prieš jį pirmą kartą naudojant netinkamai ir, jei sukurtas, sunaikinamas išeinant iš siūlų.“

Išvada

Objekto gyvavimo laikas prasideda, kai jo inicializavimas yra baigtas, ir baigiasi, kai atleidžiama jo saugykla. Dinaminės saugyklos trukmė prasideda, kai inicializuojama (naujo tipo) sukurta saugykla, ir baigiasi, kai objektas išeina iš srities arba ištrinamas „ištrinti rodyklę“. Statinio objekto trukmė prasideda, kai objektas yra inicializuotas, ir baigiasi programos pabaigoje. Inicializavus statinį objektą, jo pradinė vertė negali būti pakeista, net jei jo apibrėžimas yra iš naujo įvertintas. Prie statinių duomenų narių ir statinių funkcijų narių galima prisijungti už klasės aprašymo ribų su „ClassName :: name“.

Chrys

Nemokami ir atvirojo kodo žaidimų varikliai, skirti kurti „Linux“ žaidimus
Šiame straipsnyje bus pateiktas nemokamų ir atvirojo kodo žaidimų variklių, kurie gali būti naudojami kuriant 2D ir 3D žaidimus „Linux“, sąrašas. Toki...
„Tomb Raider for Linux“ pamoka
„Tomb Raider“ šešėlis yra dvyliktas „Tomb Raider“ serijos priedas - veiksmo ir nuotykių žaidimų franšizė, sukurta „Eidos Montreal“. Žaidimą kritikai i...
Kaip padidinti FPS sistemoje „Linux“?
FPS reiškia Kadrai per sekundę. FPS užduotis yra išmatuoti kadrų greitį atkuriant vaizdo įrašus ar žaidimus. Paprastais žodžiais, nepertraukiamų viso ...