Để đi vào lý do tại sao size_t
cần phải tồn tại và làm thế nào chúng ta đến đây:
Theo thuật ngữ thực dụng size_t
và ptrdiff_t
được đảm bảo rộng 64 bit khi triển khai 64 bit, rộng 32 bit khi triển khai 32 bit, v.v. Họ không thể ép bất kỳ loại hiện có nào có nghĩa là, trên mọi trình biên dịch, mà không phá vỡ mã kế thừa.
Một size_t
hoặc ptrdiff_t
không nhất thiết phải giống như một intptr_t
hoặc uintptr_t
. Chúng khác nhau về các kiến trúc nhất định vẫn còn được sử dụng khi size_t
và ptrdiff_t
được thêm vào Tiêu chuẩn vào cuối những năm 80 và trở nên lỗi thời khi C99 thêm nhiều loại mới nhưng chưa biến mất (như Windows 16 bit). X86 ở chế độ được bảo vệ 16 bit có bộ nhớ được phân đoạn trong đó mảng hoặc cấu trúc lớn nhất có thể có kích thước chỉ 65.536 byte, nhưng far
con trỏ cần phải rộng 32 bit, rộng hơn các thanh ghi. Trên những cái đó, intptr_t
sẽ có chiều rộng 32 bit nhưng size_t
vàptrdiff_t
có thể rộng 16 bit và vừa vặn trong một thanh ghi. Và ai biết loại hệ điều hành nào có thể được viết trong tương lai? Về lý thuyết, kiến trúc i386 cung cấp mô hình phân đoạn 32 bit với các con trỏ 48 bit mà chưa có hệ điều hành nào thực sự sử dụng.
Loại bù bộ nhớ không thể là long
do có quá nhiều mã kế thừa giả định long
chính xác là rộng 32 bit. Giả định này thậm chí đã được tích hợp vào API UNIX và Windows. Thật không may, rất nhiều mã kế thừa khác cũng cho rằng một mã long
đủ rộng để chứa một con trỏ, một tệp bù, số giây đã trôi qua kể từ năm 1970, v.v. POSIX hiện cung cấp một cách tiêu chuẩn hóa để buộc giả định sau là đúng thay vì giả định trước, nhưng cũng không phải là giả định di động để thực hiện.
Không thể nào int
vì chỉ một số ít trình biên dịch trong thập niên 90 tạo ra int
64 bit. Sau đó, họ thực sự trở nên kỳ lạ bằng cách giữ long
32 bit rộng. Bản sửa đổi tiếp theo của Tiêu chuẩn tuyên bố nó bất hợp pháp vì int
rộng hơn long
, nhưng int
vẫn rộng 32 bit trên hầu hết các hệ thống 64 bit.
Không thể long long int
, dù sao nó đã được thêm vào sau đó, vì nó được tạo ra có chiều rộng tối thiểu 64 bit ngay cả trên các hệ thống 32 bit.
Vì vậy, một loại mới là cần thiết. Ngay cả khi nó không, tất cả các loại khác có nghĩa là một cái gì đó khác với phần bù trong một mảng hoặc đối tượng. Và nếu có một bài học từ sự chuyển đổi từ 32 đến 64 bit, thì đó là cụ thể về các thuộc tính mà một loại cần có, và không sử dụng một thuộc tính có nghĩa là những thứ khác nhau trong các chương trình khác nhau.
int
nếusome_size
được ký,size_t
nếu nó không được ký.