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țiai >= 0este mereu adevărată pentru un tip fără semn, deci bucla nu se oprește și citește în afara vectorului. - Compari
int icuv.size(). Cu-Werrorcodul nu compilează (avertisment de comparație signed/unsigned); foloseștestd::size_tpentru 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.