Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Khác biệt giữa size_t và int trong C++

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ểmsize_tint
Dấu (Signedness)Unsigned (không dấu)Signed (có dấu)
Kích thước 32-bit32-bit32-bit
Kích thước 64-bit64-bitThường 32-bit
Phạm vi 64-bit0 đến 2⁶⁴-1-2³¹ đến 2³¹-1
Mục đíchKích thước đối tượng, index mảngSố 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_t cho: index mảng, kích thước container, offset bộ nhớ
  • Dùng int cho: số lượng logic, phép tính có thể âm, giao diện API
  • Tránh so sánh trực tiếp int với size_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_t là 64-bit, int thường vẫn 32-bit.