sizeof în C++

Dă numărul de octeți ocupați în memorie de un tip sau de o variabilă; se calculează la compilare.

Sintaxă
sizeof(tip)
sizeof expresie
sizeof...(pachet)   // C++11, numărul de argumente din șablon

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) sau sizeof(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.