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
- Trajanje shranjevanja
- Trajanje samodejnega shranjevanja
- Dinamično trajanje shranjevanja
- Trajanje statičnega shranjevanja
- Trajanje shranjevanja niti
- Zaključek
Prikaz življenjske dobe predmeta
Upoštevajte naslednji program:
#includeuporaba 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.
#includeuporaba 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 intTo 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):
#includeuporaba 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:
#includeuporaba 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 ():
#includeuporaba 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:
#includeuporaba 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:
#includeuporaba 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:
- 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.
- 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