C ++

Životni vijek i trajanje pohrane u C ++

Životni vijek i trajanje pohrane u C ++
Tijekom stvaranja objekta mora se utvrditi njegovo mjesto u memoriji prije nego što se pokrene. Inicijalizacija znači stavljanje vrijednosti u lokaciju. Životni vijek objekta započinje odmah nakon inicijalizacije. Kada objekt umre, njegovo se mjesto (spremište), koje je objekt zauzeo, oslobađa, a zatim se računalo isključuje ili pohranu zauzima (koristi) drugi objekt. Oslobađanje sredstva za pohranu, čineći identifikator ili pokazivač koji je zauzimao pohranu nevaljanim. Životni vijek predmeta završava kad se oslobodi njegovo skladište.

Potrebno je malo vremena za stvaranje predmeta. Potrebno je malo vremena za ubijanje predmeta. Kada se govori o predmetu, uključene su dvije stvari: mjesto koje je spremište i vrijednost. Značenje života i trajanja skladištenja su slični; ali trajanje se vidi više s gledišta mjesta nego s gledišta vrijednosti. Trajanje pohrane je vrijeme od kada je mjesto povezano s objektom do trenutka kada je mjesto odvojeno od objekta.

Ostatak ovog članka ilustrira životni vijek predmeta i ukratko objašnjava različita trajanja pohrane. Trebali biste imati osnovno znanje na jeziku C ++ kako biste razumjeli ovaj članak. Također biste trebali imati znanje iz opsega C ++.

Sadržaj članka

Ilustracija životnog vijeka objekta

Razmotrite sljedeći program:

#include
pomoću prostora imena std;
int main ()

ako (1 == 1)

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

return 0;

Izlaz je 1A .

Život predmeta završava kad izađe iz opsega. Životni vijek objekta x započinje s "x = 1;" a završava na kraju if-local-scope. Životni vijek objekta y započinje s "y = 'A';" a završava na kraju if-local-scope. Prije nego što oba predmeta umru, oni su zaposleni u izjavi o coutu .

Trajanje skladištenja

Trajanje pohrane određuje se jednom od sljedećih shema: automatsko trajanje pohrane; dinamičko trajanje pohrane; trajanje statičke pohrane; trajanje pohrane niti. Kategorije trajanja pohrane, također se primjenjuju na reference.

Automatsko trajanje pohrane

Ako varijabla nije eksplicitno deklarirana kao statična, nit_lokalna ili vanjska, tada ta varijabla ima automatsko trajanje pohrane. Primjeri su x i y gore. Trajanje takvih varijabli završava kad izađu iz opsega. Sljedeći program ilustrira automatsko trajanje pohrane za referencu i pokazivač u globalnom opsegu.

#include
pomoću prostora imena std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()

cout << m << *n << '\n';
return 0;

Izlaz je 1A .

Trajanje m započinje od "int & m = x;" a završava na kraju programa. Trajanje n započinje od "char * n = & y;" a završava na kraju programa.

Dinamično trajanje pohrane

Besplatna trgovina

Na modernom računalu može se istodobno izvoditi više programa. Svaki program ima svoj dio memorije. Ostatak memorije koji ne koristi nijedan program poznat je pod nazivom free store. Sljedeći se izraz koristi za vraćanje mjesta za cijeli broj iz slobodne trgovine

novi međ

Ovo mjesto (spremište) za cijeli broj, vraćeno, još uvijek treba identificirati dodjeljivanjem pokazivača. Sljedeći kod ilustrira kako koristiti pokazivač u besplatnoj trgovini:

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

Izlaz je 12 .

Da biste okončali životni vijek predmeta, upotrijebite izraz delete na sljedeći način:

izbriši ptrInt;

Argument za izraz delete je pokazivač. Sljedeći kod ilustrira njegovu upotrebu:

int * ptrInt = novo int;
* ptrInt = 12;
izbriši ptrInt;

Pokazivač stvoren s novim izrazom i izbrisan s izrazom delete ima dinamičko trajanje pohrane. Ovaj pokazivač umire kad izlazi iz opsega ili se izbriše. Trajanje objekta u prethodnom kodu započinje s “* ptrInt = 12;” i završava na kraju deklarativne regije (opseg). Izrazi new i delete imaju više nego što je ovdje raspravljeno - pogledajte kasnije.

Trajanje statičke pohrane

Statički objekt

Objekt proglašen statičnim, ponaša se poput običnog objekta, osim što njegovo trajanje pohrane započinje od trenutka kada je inicijaliziran do kraja programa. Ne može se vidjeti izvan njegovog opsega, ali se neizravno može koristiti izvan njegovog opsega.

Razmotrite sljedeći program koji bi trebao brojati od 1 do 5 (ne testirajte program):

#include
pomoću prostora imena std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
ako (stc> 5)
return 0;
fn ();

int main ()

fn ();
return 0;

Rezultat je 1 1 1 1 1 1 1 1 1 ... i nikad zapravo ne završava. Definicija funkcije je ponavljajuća funkcija; što znači da se i dalje zove dok se ne ispuni uvjet.

Rješenje je učiniti stc objekt statičnim. Jednom kada je statički objekt inicijaliziran, njegova se vrijednost ne može mijenjati dok program ne završi. Sljedeći program (koji možete testirati), koji je isti kao i gornji, ali sada sa stc izrađenim statičkim broji od 1 do 5:

#include
pomoću prostora imena std;
int fn ()

statički int stc = 1;
cout << " << stc;
stc = stc + 1;
ako (stc> 5)
return 0;
fn ();

int main ()

fn ();
return 0;

Izlaz je: 1 2 3 4 5 .

Napomena: Trajanje statičnog objekta započinje kad je objekt inicijaliziran i završava na kraju programa. U međuvremenu se objekt može koristiti neizravno, iz drugog opsega. Jednom kada se statički objekt inicijalizira, njegova se početna vrijednost ne može mijenjati, čak i ako se njegova definicija ponovno procijeni. U gornjem kodu stc se ne resetira, sljedeći put kad se pozove. Sljedeći put kad se pozove, povećava se za "stc = stc + 1;".

Član statičkih podataka

Skup povezanih varijabli i funkcija može se staviti u generaliziranu jedinicu koja se naziva klasa. Ako se varijablama daju određene vrijednosti, klasa postaje objekt. Međutim, objekt se ne stvara samo dodjeljivanjem vrijednosti varijabli. Klasa se instancira za dobivanje objekta; a svaki stvoreni objekt ima svoje ime različito od ostalih objekata iste klase. Sljedeći program prikazuje klasu koja se naziva TheCla i objekt koji se naziva obj; također pokazuje kako se objekt instancira i koristi u funkciji main ():

#include
pomoću prostora imena std;
razred TheCla

javnost:
int num;
void func (char cha, const char * str)

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

;
int main ()

TheCla obj;
obj.num = 12;
obj.func ('$', "500");
return 0;

Izlaz je:

U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.

Primijetite da da bi se varijabli num dodijelila vrijednost 12, objekt mora biti instanciran prije nego što bi se dodjela mogla izvršiti. Programer je moguće dodijeliti vrijednost bez instanciranja (stvaranja) objekta. Da bi se to postiglo, varijabla num mora biti deklarirana kao statična. Tada će mu se pristupiti kao “TheCla :: num” bez naziva objekta, ali s imenom klase. Sljedeći program to ilustrira:

#include
pomoću prostora imena std;
razred TheCla

javnost:
statički const int num = 12;
void 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");
return 0;

Izlaz je:

12
U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.

Imajte na umu da je za pristup članu podataka potrebno koristiti num u main (), operatoru razlučivanja opsega ::. Također ne da je varijablu num trebalo učiniti konstantnom i inicijalizirati u opisu klase (definiciji).

Statička funkcija člana

Primijetite da je u prethodnom popisu programa gore, da bi se koristila funkcija func u main (), objekt trebao biti instanciran. Programer je moguće pozvati funkciju bez instanciranja (stvaranja) objekta. Da bi se to postiglo, definiciji funkcije mora prethoditi riječ "statički". Tada će mu se pristupiti kao “TheCla :: func ()” bez naziva objekta, ali s imenom klase. Sljedeći program to ilustrira za statički član podataka i funkciju statičkog člana:

#include
pomoću prostora imena std;
razred TheCla

javnost:
statički const int num = 12;
statička voc funkcija (char cha, const char * str)

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

;
int main ()

TheCla :: func ('$', "500");
return 0;

Izlaz je:

U trgovini postoji 12 knjiga vrijednih 500 američkih dolara.

Trajanje pohrane niti

Nit kao značajku na C ++ još nije implementirao kompajler g ++. Dakle, umjesto da se ovo objasni, navod iz specifikacije C ++ dan je na sljedeći način:

  1. Sve varijable deklarirane ključnom riječi thread_local imaju trajanje pohrane niti. Pohrana za ove entitete trajat će sve dok nit u kojoj su stvoreni. Po niti postoji zaseban objekt ili referenca, a upotreba deklariranog imena odnosi se na entitet pridružen trenutnoj niti.
  2. Varijabla s trajanjem pohrane niti inicijalizirat će se prije prve održanja i, ako je konstruirana, uništit će se na izlazu niti."

Zaključak

Životni vijek objekta započinje kad je njegova inicijalizacija završena, a završava kad se oslobodi njegova pohrana. Dinamično trajanje pohrane započinje kada se memorija koju je stvorio (novi tip) inicijalizira, a završava kad objekt izlazi iz opsega ili se izbriše "pokazivačem za brisanje". Trajanje statičnog objekta započinje kad je objekt inicijaliziran i završava na kraju programa. Jednom kada se statički objekt inicijalizira, njegova se početna vrijednost ne može mijenjati, čak i ako se njegova definicija ponovno procijeni. Članovima statičkih podataka i članovima statičke funkcije pristupa se izvan opisa klase s „Ime klase :: ime“.

Chrys

Kontrolirajte i upravljajte kretanjem miša između više monitora u sustavu Windows 10
Dvostruki zaslon upravitelja miša omogućuje vam kontrolu i konfiguriranje kretanja miša između više monitora, usporavajući njegovo kretanje blizu gran...
WinMouse vam omogućuje prilagodbu i poboljšanje kretanja pokazivača miša na Windows računalu
Ako želite poboljšati zadane funkcije pokazivača miša, upotrijebite besplatni program WinMouse. Dodaje više značajki koje će vam pomoći da na najbolji...
Lijevi gumb miša ne radi u sustavu Windows 10
Ako s prijenosnim računalom ili stolnim računalom koristite namjenski miš, ali lijevi gumb miša ne radi u sustavu Windows 10/8/7 iz nekog razloga evo ...