C ++

Življenjska doba in trajanje shranjevanja v jeziku C ++

Življenjska doba in trajanje shranjevanja v jeziku C ++
Med ustvarjanjem predmeta je treba pred inicializacijo določiti njegovo lokacijo v pomnilniku. Inicializacija pomeni vnašanje vrednosti v lokacijo. Življenjska doba predmeta se začne takoj po inicializaciji. Ko predmet umre, se njegovo mesto (pomnilnik), ki ga je zasedel predmet, sprosti in nato računalnik izklopi ali shrambo zavzame (uporablja) drug predmet. Sprostitev pomnilniškega sredstva in onemogočanje identifikatorja ali kazalca, ki je zasedel pomnilnik. Življenjska doba predmeta se konča, ko se sprosti njegovo skladišče.

Nekaj ​​časa je potrebno za ustvarjanje predmeta. Nekaj ​​časa je potrebno za ubijanje predmeta. Ko govorimo o predmetu, gre za dve stvari: lokacijo, ki je shramba, in vrednost. Pomen življenjske dobe in trajanja skladiščenja sta si podobna; vendar je trajanje gledano bolj z vidika lokacije kot z vidika vrednosti. Trajanje shrambe je čas, ko je lokacija povezana s predmetom, do trenutka, ko je lokacija ločena od predmeta.

Preostanek tega članka prikazuje življenjsko dobo predmeta in na kratko razlaga različna trajanja shranjevanja. Za razumevanje tega članka bi morali imeti osnovno znanje jezika C ++. Morali bi imeti tudi znanje na področju C ++.

Vsebina članka

Prikaz življenjske dobe predmeta

Upoštevajte naslednji program:

#include
uporaba imenskega prostora std;
int main ()

če (1 == 1)

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

vrnitev 0;

Izhod je 1A .

Življenje predmeta se konča, ko izstopi iz obsega. Življenjska doba predmeta x se začne pri "x = 1;" in se konča na koncu obsega if-local. Življenjska doba predmeta y se začne pri "y = 'A';" in se konča na koncu obsega if-local. Preden oba predmeta umreta, se zaposlijo v izjavi o cout-u .

Trajanje shranjevanja

Trajanje shranjevanja določa ena od naslednjih shem: samodejno trajanje shranjevanja; dinamično trajanje shranjevanja; trajanje statičnega shranjevanja; trajanje shranjevanja niti. Kategorije trajanja shranjevanja veljajo tudi za reference.

Trajanje samodejnega shranjevanja

Če spremenljivka ni eksplicitno deklarirana kot statična, nit_lokalna ali zunanja, ima ta spremenljivka samodejno trajanje shranjevanja. Primeri sta x in y zgoraj. Trajanje takih spremenljivk se konča, ko izstopijo iz obsega. Naslednji program prikazuje samodejno trajanje shranjevanja za sklic in kazalec v splošnem obsegu.

#include
uporaba imenskega prostora std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()

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

Izhod je 1A .

Trajanje m se začne od “int & m = x;” in se konča na koncu programa. Trajanje n se začne od "char * n = & y;" in se konča na koncu programa.

Dinamično trajanje shranjevanja

Brezplačna trgovina

V sodobnem računalniku se lahko hkrati izvaja več programov. Vsak program ima svoj del pomnilnika. Preostali del pomnilnika, ki ga ne uporablja noben program, je znan kot free store. Naslednji izraz se uporablja za vrnitev lokacije za celo število iz proste trgovine

nov int

To mesto (pomnilnik) za celo število, vrnjeno, je treba še vedno identificirati z dodelitvijo kazalcu. Naslednja koda ponazarja, kako uporabljati kazalnik v storitvi free store:

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

Izhod je 12 .

Če želite konec življenjske dobe predmeta, uporabite izraz za brisanje na naslednji način:

izbriši ptrInt;

Argument za izraz delete je kazalec. Naslednja koda ponazarja njegovo uporabo:

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

Kazalec, ustvarjen z novim izrazom in izbrisan z izrazom delete, je dinamičnega trajanja shranjevanja. Ta kazalec umre, ko izstopi iz obsega ali se izbriše. Trajanje predmeta v prejšnji kodi se začne pri "* ptrInt = 12;" in se konča na koncu deklarativne regije (obseg). V izrazih new in delete je več, kot je bilo obravnavano tukaj - glej kasneje.

Trajanje statičnega shranjevanja

Statični objekt

Objekt, ki je razglašen za statičnega, se obnaša kot običajni objekt, le da se njegovo trajanje shranjevanja začne od inicializacije do konca programa. Ni ga mogoče videti zunaj njegovega obsega, lahko pa se posredno uporablja zunaj njegovega obsega.

Razmislite o naslednjem programu, ki naj bi štel od 1 do 5 (programa ne preizkušajte):

#include
uporaba imenskega prostora std;
int fn ()

int stc = 1;
cout << " << stc;
stc = stc + 1;
če (stc> 5)
vrnitev 0;
fn ();

int main ()

fn ();
vrnitev 0;

Rezultat je 1 1 1 1 1 1 1 1 1… in se nikoli ne konča. Definicija funkcije je ponavljajoča se funkcija; kar pomeni, da se kar naprej kliče, dokler ni izpolnjen pogoj.

Rešitev je narediti objekt stc statičen. Ko je statični objekt inicializiran, njegove vrednosti ni mogoče spreminjati, dokler se program ne konča. Naslednji program (ki ga lahko preizkusite), ki je enak zgornjemu, zdaj pa s stc statično, šteje od 1 do 5:

#include
uporaba imenskega prostora std;
int fn ()

statični int stc = 1;
cout << " << stc;
stc = stc + 1;
če (stc> 5)
vrnitev 0;
fn ();

int main ()

fn ();
vrnitev 0;

Rezultat je: 1 2 3 4 5 .

Opomba: Trajanje statičnega predmeta se začne, ko je bil objekt inicializiran, in konča na koncu programa. Medtem lahko predmet uporabljamo posredno, z drugačnega obsega. Ko je statični objekt inicializiran, njegove začetne vrednosti ni mogoče spremeniti, tudi če je njegova definicija ponovno ocenjena. V zgornji kodi se stc ne ponastavi, ko ga naslednjič pokličete. Ko se naslednjič pokliče, se poveča za "stc = stc + 1;".

Član s statičnimi podatki

Nabor povezanih spremenljivk in funkcij lahko damo v posplošeno enoto, imenovano razred. Če spremenljivke dobijo posebne vrednosti, razred postane objekt. Vendar objekt ni ustvarjen s samo dodelitvijo vrednosti spremenljivki. Razred se ustvari za pridobitev predmeta; in vsak ustvarjeni objekt ima svoje ime, ki se razlikuje od drugih predmetov istega razreda. Naslednji program prikazuje razred, imenovan TheCla, in objekt, imenovan obj; prikazuje tudi, kako je objekt instantiran in uporabljen v funkciji main ():

#include
uporaba imenskega prostora std;
razred TheCla

javno:
int številka;
void func (char cha, const char * str)

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

;
int main ()

TheCla obj;
obj.število = 12;
obj.func ('$', "500");
vrnitev 0;

Rezultat je:

V trgovini je 12 knjig v vrednosti 500 dolarjev.

Upoštevajte, da je treba spremenljivki num dodeliti vrednost 12, preden mora biti dodelitev izvedena z instanco, preden se lahko izvede dodelitev. Programer lahko dodeli vrednost, ne da bi ustvaril (ustvaril) objekt. Da bi to dosegli, bo treba spremenljivko num označiti kot statično. Nato bo dostopen kot “TheCla :: num” brez imena predmeta, vendar z imenom razreda. Naslednji program to ponazarja:

#include
uporaba imenskega prostora std;
razred TheCla

javno:
statična 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");
vrnitev 0;

Rezultat je:

12
V trgovini je 12 knjig v vrednosti 500 dolarjev.

Upoštevajte, da je bil za dostop do podatkovnega člana uporabljen operater za ločljivost obsega :: v številki main (). Prav tako ne, da je bilo treba spremenljivko num določiti konstantno in inicializirati v opisu razreda (definiciji).

Statična funkcija člana

Upoštevajte, da je bilo treba v prejšnjem seznamu programov zgoraj uporabiti funkcijsko funkcijo v main () objekt. Programer lahko pokliče funkcijo, ne da bi ustvaril (ustvaril) objekt. Da bi to dosegli, mora biti pred definicijo funkcije beseda "statična". Nato bo dostopen kot “TheCla :: func ()” brez imena predmeta, vendar z imenom razreda. Naslednji program to ponazarja za funkcijo statičnega člana in funkcijo statičnega člana:

#include
uporaba imenskega prostora std;
razred TheCla

javno:
statična const int num = 12;
statična void funkcija (char cha, const char * str)

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

;
int main ()

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

Rezultat je:

V trgovini je 12 knjig v vrednosti 500 dolarjev.

Trajanje shranjevanja niti

Prevajalec g ++ še ni uvedel niti kot funkcije v jeziku C ++. Namesto da bi to pojasnili, je navedba iz specifikacije C ++ podana na naslednji način:

  1. Vse spremenljivke, deklarirane s ključno besedo thread_local, imajo trajanje shranjevanja niti. Shramba za te entitete traja toliko časa, ko nit, v kateri so ustvarjene. Na nit je ločen predmet ali sklic, uporaba deklariranega imena pa se nanaša na entiteto, povezano s trenutno nitjo.
  2. Spremenljivka s trajanjem shranjevanja niti se inicializira pred njeno prvo uporabo in, če je sestavljena, se ob izhodu niti uniči."

Zaključek

Življenjska doba predmeta se začne, ko je njegova inicializacija končana, in konča, ko se sprosti skladišče. Dinamično trajanje pomnilnika se začne, ko se pomnilnik, ki ga je ustvaril [new Type], inicializira, in konča, ko objekt izstopi iz obsega ali pa ga izbriše »kazalec za brisanje. Trajanje statičnega predmeta se začne, ko je bil objekt inicializiran, in se konča na koncu programa. Ko je statični objekt inicializiran, njegove začetne vrednosti ni mogoče spremeniti, tudi če je njegova definicija ponovno ocenjena. Člani statičnih podatkov in člani statične funkcije so dostopni zunaj opisa razreda z “ClassName :: name”.

Chrys

Kako prenesti in igrati Sid Meier's Civilization VI v Linuxu
Uvod v igro Civilization 6 je sodoben pogled na klasični koncept, uveden v seriji iger Age of Empires. Ideja je bila dokaj preprosta; začeli bi v zelo...
Kako namestiti in igrati Doom v Linuxu
Uvod v Doom Serija Doom je nastala v devetdesetih letih po izidu prvotnega Dooma. Bil je takojšen hit in od takrat naprej je serija iger prejela števi...
Vulkan za uporabnike Linuxa
Z vsako novo generacijo grafičnih kart vidimo, da razvijalci iger premikajo meje grafične zvestobe in se približujejo fotorealizmu. A kljub vsem kredi...