C++ oferă 6 clase de stocare diferite, care sunt următoarele:
Cuprins
Mai jos este o explicație detaliată a fiecărei clase de stocare:
1. Clasa de Stocare auto
Clasa de stocare auto este clasa implicită a tuturor variabilelor declarate în interiorul unui bloc. Termenul auto înseamnă automat și toate variabilele locale care sunt declarate într-un bloc aparțin automat acestei clase.
Proprietățile Obiectelor Clasei de Stocare auto
- Scop: Local
- Valoare Implicită: Valoare de gunoi (nedefinită)
- Locație Memorie: RAM
- Durată de Viață: Până la sfârșitul scopului său
Să aruncăm o privire la un exemplu:
#include <iostream>
using namespace std;
int main() {
Generated code
// Declararea unei variabile auto
int a = 32;
float b = 3.2;
string c = "GeeksforGeeks";
// Afișarea variabilelor auto
cout << a << " \n";
cout << b << " \n";
cout << c << " \n";
return 0;
}
Output
32 3.2 GeeksforGeeks
Notă: Anterior în C++, puteam folosi cuvântul cheie auto pentru a declara explicit variabilele auto, dar după C++11, semnificația cuvântului cheie auto s-a schimbat și nu-l mai putem folosi pentru a defini variabilele auto.
2. Clasa de Stocare extern
Clasa de stocare extern ne spune pur și simplu că variabila este definită în altă parte și nu în același scop (sau chiar fișier sursă) unde este utilizată (adică legătură externă). Practic, variabila este creată într-un scop sau fișier diferit și poate fi utilizată și într-un fișier diferit.
O variabilă globală normală poate fi făcută și extern prin plasarea cuvântului cheie extern înaintea declarației/definiției sale în orice funcție/bloc. Scopul principal al utilizării variabilelor extern este că acestea pot fi accesate între două fișiere diferite care fac parte dintr-un program mare.
Proprietățile Obiectelor Clasei de Stocare extern
- Scop: Global
- Valoare Implicită: Zero
- Locație Memorie: RAM
- Durată de Viață: Până la sfârșitul programului.
Să aruncăm o privire la un exemplu:
def.cpp
// Definirea unei variabile globale cu legătură externă
int x = 10;
main.cpp
#include
using namespace std;
// Spunem compilatorului că variabila x este o variabilă extern
// și a fost definită în altă parte
extern int x;
int main() {
Generated code
// Afișarea valorii lui x
cout << x;
return 0;
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END
}
Output
10
3. Clasa de Stocare static
Clasa de stocare static este utilizată pentru a declara variabile statice care au proprietatea de a-și păstra valoarea chiar și după ce ies din scopul lor. Ele sunt inițializate o singură dată și există până la terminarea programului. Astfel, nu se alocă memorie nouă deoarece nu sunt redeclarate. Variabilele statice globale pot fi accesate oriunde în program, dar spre deosebire de variabilele extern, ele au legătură internă, deci nu pot fi accesate în afara programului.
Ele sunt declarate folosind cuvântul cheie static.
Proprietățile Clasei de Stocare static
- Scop: Local
- Valoare Implicită: Zero
- Locație Memorie: RAM
- Durată de Viață: Până la sfârșitul programului
Să aruncăm o privire la un exemplu:
#include
using namespace std;
// Funcție care conține variabile statice
// memoria este reținută în timpul execuției
int func() {
Generated code
// Variabilă statică
static int count = 0;
count++;
return count;
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END
}
int main() {
cout << func() << "\n";
cout << func();
Generated code
return 0;
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END
}
Output
1 2
4. Clasa de Stocare register
Clasa de stocare register declară variabile de registru folosind cuvântul cheie register, care are aceeași funcționalitate ca și variabilele auto. Singura diferență este că compilatorul încearcă să stocheze aceste variabile în registrul microprocesorului dacă un registru liber este disponibil. Acest lucru face ca utilizarea variabilelor de registru să fie mult mai rapidă decât cea a variabilelor stocate în memorie în timpul rulării programului. Dacă un registru liber nu este disponibil, acestea sunt stocate în RAM.
Un punct important și interesant de reținut aici este că nu putem obține adresa unei variabile de registru folosind pointeri.
Proprietățile Obiectelor Clasei de Stocare register
- Scop: Local
- Valoare Implicită: Valoare de gunoi (nedefinită)
- Locație Memorie: Registru în CPU sau RAM
- Durată de Viață: Până la sfârșitul scopului său
Să aruncăm o privire la un exemplu:
#include
using namespace std;
int main() {
Generated code
// Declararea unei variabile de registru
register char b = 'G';
// Afișarea variabilei de registru 'b'
cout << b;
return 0;
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END
}
Output
G
Notă: Cuvântul cheie register este depreciat în C++17 și versiunile ulterioare.
5. Clasa de Stocare mutable
Uneori există cerința de a modifica unul sau mai mulți membri de date ai clasei/structurii printr-o funcție const, chiar dacă nu doriți ca funcția să actualizeze alți membri ai clasei/structurii. Această sarcină poate fi realizată cu ușurință folosind cuvântul cheie mutable. Cuvântul cheie mutable este utilizat în principal pentru a permite modificarea unui anumit membru de date al unui obiect const.
Când declarăm o funcție ca const, pointerul this transmis funcției devine const. Adăugarea mutable la o variabilă permite unui pointer const să modifice membrii.
Proprietățile Clasei de Stocare mutable
Specificatorul mutable nu afectează legătura sau durata de viață a obiectului. Acestea vor fi la fel ca la un obiect normal declarat în acel loc.
Să aruncăm o privire la un exemplu:
#include
using namespace std;
class A {
public:
int x;
Generated code
// Definirea variabilei mutabile y
// acum aceasta poate fi modificată
mutable int y;
A(): x(4), y(10) {}
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END
};
int main() {
Generated code
// a este creat ca constantă
const A a;
// Încercarea de a schimba valoarea
a.y = 200;
cout << a.y;
// Eliminarea comentariilor de mai jos
// va genera eroare
/* a.x = 8;
cout << a.x; */
return 0;
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END
}
Output
200
6. Clasa de Stocare thread_local
Clasa de Stocare thread_local este noua clasă de stocare adăugată în C++11. Putem folosi specificatorul clasei de stocare thread_local pentru a defini obiectul ca thread_local. Variabila thread_local poate fi combinată cu alți specificatori de stocare, cum ar fi static sau extern, iar proprietățile obiectului thread_local se modifică în consecință.
Proprietățile Clasei de Stocare thread_local
- Locație Memorie: RAM
- Durată de Viață: Până la sfârșitul firului său de execuție
Să aruncăm o privire la un exemplu:
#include
#include
#include
using namespace std;
// Definirea variabilei thread-local
thread_local int val = 10;
// Mutex pentru sincronizare
mutex mtx;
int main() {
Generated code
// Create 3 fire de execuție
// Modifică valoarea în firul 1
thread th1([]() {
val += 18;
lock_guard lock(mtx);
cout << "Valoare fir 1: " << val << '\n';
});
thread th2([]() {
// Modifică valoarea în firul 2
val += 7;
lock_guard lock(mtx);
cout << "Valoare fir 2: " << val << '\n';
});
thread th3([]() {
// Modifică valoarea în firul 3
val += 13;
lock_guard lock(mtx);
cout << "Valoare fir 3: " << val << '\n';
});
// Așteaptă finalizarea tuturor firelor de execuție
th1.join();
th2.join();
th3.join();
// Afișează valoarea variabilei în firul principal
cout << "Valoare fir principal: " << val << '\n';
return 0;
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
IGNORE_WHEN_COPYING_END
}
Output
Valoare fir 1: 28 Valoare fir 2: 17 Valoare fir 3: 23 Valoare fir principal: 10
După cum putem vedea, fiecare fir de execuție a primit propria copie a variabilei thread_local și i s-a atribuit doar valoarea specificată în funcția sa apelabilă.





