std::size_t în C++

Tip întreg fără semn pentru mărimi și indici: îl returnează sizeof și metodele size() ale containerelor.

Sintaxă
#include <cstddef>
std::size_t n = sizeof(x);
std::size_t m = v.size();

Ce face std::size_t

std::size_t este tipul întreg fără semn suficient de mare pentru mărimea oricărui obiect din memorie: 64 de biți pe sistemele moderne. sizeof returnează size_t, iar size() al containerelor returnează size_type, care este de obicei tot size_t.

Fiind fără semn, nu poate fi negativ: 0 - 1 dă cel mai mare număr posibil. Comparația cu un int cu semn poate da rezultate greșite, iar compilatorul avertizează (-Wsign-compare). Pentru indici în bucle folosește std::size_t, iar pentru diferențe care pot fi negative, std::ptrdiff_t sau std::ssize(v) (C++20).

Ce returnează

Un tip de date (alias pentru unsigned long pe macOS și Linux pe 64 de biți).

Exemple

Exemplul 1: Mărimi și indici

#include <cstddef>
#include <limits>
#include <print>
#include <string>
#include <vector>

int main() {
    std::vector<std::string> orase{"Iași", "Cluj", "Timișoara"};

    for (std::size_t i = 0; i < orase.size(); ++i) {
        std::println("{}: {}", i, orase[i]);
    }

    std::println("sizeof(std::size_t) = {} octeți", sizeof(std::size_t));
    std::println("valoarea maximă: {}", std::numeric_limits<std::size_t>::max());
}

Rezultat

0: Iași
1: Cluj
2: Timișoara
sizeof(std::size_t) = 8 octeți
valoarea maximă: 18446744073709551615

Exemplul 2: Capcana scăderii sub zero

Pentru un vector gol, v.size() - 1 nu este −1, ci cel mai mare size_t. std::ssize returnează o mărime cu semn.

#include <cstddef>
#include <iterator>
#include <print>
#include <vector>

int main() {
    std::vector<int> gol;
    std::size_t ultimul = gol.size() - 1;
    std::println("gol.size() - 1 = {}", ultimul);

    std::println("std::ssize(gol) - 1 = {}", std::ssize(gol) - 1);

    // parcurgere inversă corectă cu size_t
    std::vector<int> v{1, 2, 3};
    for (std::size_t i = v.size(); i-- > 0;) {
        std::print("{} ", v[i]);
    }
    std::println();
}

Rezultat

gol.size() - 1 = 18446744073709551615
std::ssize(gol) - 1 = -1
3 2 1

Greșeli frecvente

  • Scrii for (std::size_t i = v.size() - 1; i >= 0; --i). Condiția i >= 0 este mereu adevărată pentru un tip fără semn, deci bucla nu se oprește și citește în afara vectorului.
  • Compari int i cu v.size(). Cu -Werror codul nu compilează (avertisment de comparație signed/unsigned); folosește std::size_t pentru index.

Comenzi înrudite

  • std::int32_t: Tipuri întregi cu mărime exactă: int32_t are mereu 32 de biți, uint8_t 8 biți fără semn etc.
  • sizeof: Dă numărul de octeți ocupați în memorie de un tip sau de o variabilă; se calculează la compilare.
  • std::vector::size: size() spune câte elemente are vectorul; empty() spune dacă nu are niciunul.
  • std::in_range: Verifică dacă un număr întreg încape în alt tip întreg, fără capcanele conversiilor cu semn.