Na vytvorenie objektu je potrebný istý čas. Na zabitie objektu je potrebný istý čas. Keď hovoríme o objekte, sú to dve veci: umiestnenie, ktoré je úložiskom, a hodnota. Význam životnosti a doby skladovania sú podobné; ale na trvanie sa pozeráme viac z pohľadu miesta ako z hľadiska hodnoty. Trvanie úložiska je čas od okamihu, keď je miesto spojené s objektom, do času, keď je miesto oddelené od objektu.
Zvyšok tohto článku ilustruje životnosť objektu a stručne vysvetľuje rôzne doby trvania úložiska. Aby ste pochopili tento článok, mali by ste mať základné znalosti v jazyku C ++. Mali by ste tiež mať znalosti v rozsahu C ++.
Obsah článku
- Ilustrácia životnosti objektu
- Doba skladovania
- Trvanie automatického ukladania
- Doba dynamického ukladania
- Statické trvanie ukladania
- Trvanie uloženia vlákna
- Záver
Ilustrácia životnosti objektu
Zvážte nasledujúci program:
#includepomocou namespace std;
int main ()
ak (1 == 1)
int x;
x = 1;
char y;
y = 'A';
cout << x << y << '\n';
návrat 0;
Výstup je 1A .
Životnosť objektu sa končí, keď sa dostane mimo rozsah. Životnosť objektu x sa začína „x = 1;“ a končí sa na konci rozsahu if-local. Životnosť objektu y sa začína „y = 'A';“ a končí sa na konci rozsahu if-local. Predtým, ako oba objekty zomrú, sú použité vo vyhlásení cout .
Doba skladovania
Trvanie pamäte je určené jednou z nasledujúcich schém: automatické trvanie pamäte; doba dynamického ukladania; trvanie statického ukladania; doba uloženia vlákna. Kategórie trvania úložiska sa vzťahujú aj na referencie.
Trvanie automatického ukladania
Ak premenná nie je explicitne deklarovaná ako statická, thread_local alebo extern, potom má táto premenná automatické trvanie úložiska. Príklady sú xay vyššie. Trvanie takýchto premenných končí, keď vyjdú z rozsahu. Nasledujúci program ilustruje trvanie automatického ukladania pre referenciu a ukazovateľ v globálnom rozsahu.
#includepomocou namespace std;
int x = 1;
int & m = x;
char y = 'A';
char * n = & y;
int main ()
cout << m << *n << '\n';
návrat 0;
Výstup je 1A .
Trvanie m začína od „int & m = x;“ a končí sa na konci programu. Trvanie n začína od „char * n = & y;“ a končí sa na konci programu.
Doba dynamického ukladania
Obchod zadarmo
V modernom počítači môže byť spustených súčasne viac programov. Každý program má svoju vlastnú časť pamäte. Zvyšok pamäte, ktorý nevyužíva žiadny program, sa nazýva voľný obchod. Nasledujúci výraz sa používa na vrátenie polohy celého čísla z bezplatného obchodu
nová intToto umiestnenie (úložisko) pre celé číslo, ktoré je vrátené, musí byť stále identifikované priradením ukazovateľa. Nasledujúci kód ilustruje, ako používať ukazovateľ vo voľnom obchode:
int * ptrInt = new int;* ptrInt = 12;
cout<< *ptrInt <<'\n';
Výstup je 12 .
Ak chcete ukončiť životnosť objektu, použite nasledujúci výraz:
vymazať ptrInt;Argument pre výraz delete je ukazovateľ. Nasledujúci kód ilustruje jeho použitie:
int * ptrInt = new int;* ptrInt = 12;
vymazať ptrInt;
Ukazovateľ vytvorený pomocou nového výrazu a odstránený pomocou výrazu delete má dynamické trvanie pamäte. Tento ukazovateľ zomrie, keď vyjde z rozsahu alebo je odstránený. Trvanie objektu v predchádzajúcom kóde začína na „* ptrInt = 12;“ a končí sa na konci deklaratívnej oblasti (rozsahu). V nových a vymazaných výrazoch je viac, ako tu bolo diskutovaných - pozri ďalej.
Statické trvanie ukladania
Statický objekt
Objekt deklarovaný ako statický sa chová ako bežný objekt, okrem toho, že doba jeho uloženia začína od jeho inicializácie do konca programu. Nemôže byť videný mimo jeho rozsahu, ale môže byť nepriamo zamestnaný mimo jeho rozsahu.
Zvážte nasledujúci program, ktorý má počítať od 1 do 5 (program netestujte):
#includepomocou namespace std;
int fn ()
int stc = 1;
cout << " << stc;
stc = stc + 1;
ak (stc> 5)
návrat 0;
fn ();
int main ()
fn ();
návrat 0;
Výstup je 1 1 1 1 1 1 1 1 ... a nikdy nekončí. Definícia funkcie je opakujúca sa funkcia; čo znamená, že si hovorí, kým nie je splnená podmienka.
Riešením je statický objekt stc. Po inicializácii statického objektu nie je možné zmeniť jeho hodnotu, kým sa program neskončí. Nasledujúci program (ktorý môžete otestovať), ktorý je rovnaký ako vyššie uvedený program, ale teraz je statický statický, počíta od 1 do 5:
#includepomocou namespace std;
int fn ()
statický int stc = 1;
cout << " << stc;
stc = stc + 1;
ak (stc> 5)
návrat 0;
fn ();
int main ()
fn ();
návrat 0;
Výstup je: 1 2 3 4 5 .
Poznámka: Trvanie statického objektu začína, keď bol objekt inicializovaný, a končí na konci programu. Medzitým je možné objekt použiť nepriamo, z iného rozsahu. Po inicializácii statického objektu nie je možné zmeniť jeho počiatočnú hodnotu, a to ani v prípade, že sa jeho definícia prehodnocuje. Vo vyššie uvedenom kóde sa stc nereštartuje, pri ďalšom volaní. Pri ďalšom volaní sa zvýši o „stc = stc + 1;“.
Člen statických údajov
Množinu súvisiacich premenných a funkcií je možné vložiť do zovšeobecnenej jednotky nazývanej trieda. Ak sú premenným dané konkrétne hodnoty, trieda sa stane objektom. Objekt sa však nevytvára iba priradením hodnôt k premennej. Trieda je inštancovaná na získanie objektu; a každý vytvorený objekt má svoj vlastný názov odlišný od ostatných objektov tej istej triedy. Nasledujúci program zobrazuje triedu nazvanú TheCla a objekt nazývaný obj; tiež ukazuje, ako je objekt inštancovaný a používaný vo funkcii main ():
#includepomocou namespace std;
trieda TheCla
verejné:
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");
návrat 0;
Výstup je:
V obchode je 12 kníh v hodnote 500 dolárov.
Všimnite si, že aby bolo možné priradiť hodnotu 12 premennej num, musí sa objekt vytvoriť inštanciou, aby mohlo dôjsť k priradeniu. Je možné, že programátor priradí hodnotu bez vytvorenia inštancie (vytvorenia) objektu. Aby sa to dosiahlo, bude musieť byť premenná, num, deklarovaná ako statická. Potom bude prístupné ako „TheCla :: num“ bez názvu objektu, ale s názvom triedy. Nasledujúci program to ilustruje:
#includepomocou namespace std;
trieda TheCla
verejné:
static 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");
návrat 0;
Výstup je:
12
V obchode je 12 kníh v hodnote 500 dolárov.
Upozorňujeme, že na prístup k údajovému členu num in main () bolo potrebné použiť operátor rozlíšenia rozsahu, ::. Tiež nie, že premenná, num musela byť konštantná a inicializovaná v popise triedy (definícii).
Funkcia statického člena
Všimnite si, že v predchádzajúcom zozname programov vyššie, aby bolo možné použiť funkciu func v main (), bolo treba vytvoriť inštanciu objektu. Je možné, že programátor túto funkciu zavolá bez vytvorenia inštancie (vytvorenia) objektu. Aby sa to dosiahlo, pred definíciou funkcie musí byť uvedené slovo „statický“. Potom bude prístupné ako „TheCla :: func ()“ bez názvu objektu, ale s názvom triedy. Nasledujúci program to ilustruje pre statický údajový člen a funkciu statického člena:
#includepomocou namespace std;
trieda TheCla
verejné:
static const int num = 12;
static void func (char cha, const char * str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
;
int main ()
TheCla :: func ('$', "500");
návrat 0;
Výstup je:
V obchode je 12 kníh v hodnote 500 dolárov.
Trvanie uloženia vlákna
Vlákno ako vlastnosť v C ++ ešte nebolo implementované kompilátorom g ++. Takže namiesto vysvetlenia je citácia zo špecifikácie C ++ uvedená nasledovne:
- Všetky premenné deklarované kľúčovým slovom thread_local majú trvanie úložiska vlákna. Úložisko pre tieto entity vydrží po dobu vlákna, v ktorom sú vytvorené. Na jedno vlákno existuje samostatný objekt alebo odkaz a použitie deklarovaného názvu sa vzťahuje na entitu spojenú s aktuálnym vláknom.
- Premenná s dobou uloženia vlákna sa inicializuje pred prvým použitím zápachu a ak je zostrojená, zničí sa pri výstupe z vlákna.“
Záver
Životnosť objektu začína po dokončení jeho inicializácie a končí sa uvoľnením jeho úložiska. Doba dynamického ukladacieho priestoru začína, keď sa inicializuje úložisko vytvorené (novým typom), a končí sa tým, keď objekt vyjde z rozsahu alebo je odstránený „ukazovateľom odstránenia“. Trvanie statického objektu začína, keď bol objekt inicializovaný, a končí na konci programu. Po inicializácii statického objektu nie je možné zmeniť jeho počiatočnú hodnotu, a to ani v prípade, že sa jeho definícia prehodnocuje. K statickým dátovým členom a členom statickej funkcie sa pristupuje mimo popisu triedy pomocou „ClassName :: name“.
Chrys