Ce face sizeof
sizeof răspunde la întrebarea „câți octeți ocupă?”. Rezultatul este de tip std::size_t și se calculează la compilare, deci nu costă nimic la rulare. Pentru tipuri se scriu paranteze obligatoriu (sizeof(int)); pentru variabile sunt opționale.
sizeof(char) este întotdeauna 1. Restul mărimilor depind de sistem: rezultatele de mai jos sunt de pe macOS pe 64 de biți. Un pointer are aceeași mărime (8 octeți) indiferent spre ce arată.
Pentru un tablou clasic, sizeof(tablou) dă mărimea totală, deci sizeof(t) / sizeof(t[0]) dă numărul de elemente. În C++ modern folosește std::size(t).
Exemple
Exemplul 1: Mărimea tipurilor de bază
#include <print>
int main() {
std::println("char: {}", sizeof(char));
std::println("bool: {}", sizeof(bool));
std::println("int: {}", sizeof(int));
std::println("double: {}", sizeof(double));
std::println("int*: {}", sizeof(int*));
}
Rezultat
char: 1
bool: 1
int: 4
double: 8
int*: 8
Exemplul 2: Numărul de elemente al unui tablou
std::size (C++17) face același calcul și este mai sigur.
#include <iterator>
#include <print>
int main() {
int note[] = {9, 10, 7, 8, 10};
std::println("Mărime tablou: {} octeți", sizeof(note));
std::println("Elemente: {}", sizeof(note) / sizeof(note[0]));
std::println("Cu std::size: {}", std::size(note));
}
Rezultat
Mărime tablou: 20 octeți
Elemente: 5
Cu std::size: 5
Exemplul 3: sizeof… numără argumentele unui șablon
#include <print>
template <typename... Argumente>
void numara(Argumente... args) {
std::println("Am primit {} argumente", sizeof...(args));
}
int main() {
numara(1, 2.5, "Ana");
numara();
}
Rezultat
Am primit 3 argumente
Am primit 0 argumente
Greșeli frecvente
- Folosești
sizeof(tablou) / sizeof(tablou[0])într-o funcție care a primit tabloul ca parametru. Acolo tabloul a devenit pointer, deci rezultatul este mărimea pointerului împărțită la mărimea elementului (de exemplu 8 / 4 = 2). - Crezi că
sizeof(std::string)sausizeof(std::vector<int>)dă lungimea textului sau numărul de elemente. Dă doar mărimea obiectului de control (fixă); folosește.size().
Comenzi înrudite
alignas, alignof: alignof spune la ce multiplu de octeți trebuie să înceapă un tip în memorie; alignas cere o aliniere mai mare.int: Tipul de bază pentru numere întregi (fără zecimale), de obicei pe 4 octeți, cu valori între aproximativ -2,1 și 2,1 miliarde.signed, unsigned, short, long: Modificatori care schimbă mărimea (short, long) sau semnul (signed, unsigned) tipurilor întregi.pointeri (*, &): Un pointer este o variabilă care ține adresa altei variabile; prin el poți citi și modifica valoarea de la acea adresă.std::size_t: Tip întreg fără semn pentru mărimi și indici: îl returnează sizeof și metodele size() ale containerelor.