size_t và int đều là kiểu số nguyên, nhưng có khác biệt quan trọng về kích thước, dấu (signedness) và mục đích sử dụng.
Bảng so sánh
| Đặc điểm | size_t | int |
|---|---|---|
| Dấu (Signedness) | Unsigned (không dấu) | Signed (có dấu) |
| Kích thước 32-bit | 32-bit | 32-bit |
| Kích thước 64-bit | 64-bit | Thường 32-bit |
| Phạm vi 64-bit | 0 đến 2⁶⁴-1 | -2³¹ đến 2³¹-1 |
| Mục đích | Kích thước đối tượng, index mảng | Số nguyên chung |
| Header | <cstddef>, <cstdlib> | Built-in |
Ví dụ minh họa trên hệ 64-bit
#include <iostream>
#include <cstddef>
using namespace std;
int main() {
cout << "sizeof(size_t) = " << sizeof(size_t) << " bytes" << endl; // 8
cout << "sizeof(int) = " << sizeof(int) << " bytes" << endl; // 4
cout << "sizeof(unsigned int) = " << sizeof(unsigned int) << " bytes" << endl; // 4
cout << "sizeof(long) = " << sizeof(long) << " bytes" << endl; // 8 (Linux) hoặc 4 (Windows)
cout << "sizeof(long long) = " << sizeof(long long) << " bytes" << endl; // 8
}
Kết quả (Linux 64-bit)
sizeof(size_t) = 8 bytes sizeof(int) = 4 bytes sizeof(unsigned int) = 4 bytes sizeof(long) = 8 bytes sizeof(long long) = 8 bytes
Vấn đề thường gặp
1. So sánh signed/unsigned
std::vector<int> v(10);
for (int i = 0; i < v.size(); ++i) { // Warning: signed/unsigned mismatch
// ...
}
Sửa: Dùng size_t i hoặc auto i hoặc std::vector<int>::size_type i
2. Tràn số khi trừ size_t
size_t a = 5, b = 10;
auto diff = a - b; // Không phải -5! Là số unsigned rất lớn (wrap-around)
3. Hàm trả về size_t
std::string s = "hello";
int len = s.length(); // Warning: narrowing conversion
size_t len2 = s.length(); // Đúng
Khuyến nghị thực hành
- Dùng
size_tcho: index mảng, kích thước container, offset bộ nhớ - Dùng
intcho: số lượng logic, phép tính có thể âm, giao diện API - Tránh so sánh trực tiếp
intvớisize_t - C++20: Dùng
std::ssize()để lấy size có dấu
Tóm tắt
size_t là kiểu chuẩn cho "kích thước" — unsigned, đủ lớn để địa chỉ toàn bộ bộ nhớ. int là kiểu số nguyên chung có dấu. Trên 64-bit,size_tlà 64-bit,intthường vẫn 32-bit.