Untuk size_t
mengetahui mengapa perlu ada dan bagaimana kita sampai di sini:
Dalam istilah pragmatis, size_t
dan ptrdiff_t
dijamin selebar 64 bit pada implementasi 64-bit, lebar 32 bit pada implementasi 32-bit, dan seterusnya. Mereka tidak bisa memaksa tipe apa pun yang ada berarti bahwa, pada setiap kompiler, tanpa melanggar kode warisan.
A size_t
atau ptrdiff_t
tidak harus sama dengan intptr_t
atau uintptr_t
. Mereka berbeda pada arsitektur tertentu yang masih digunakan kapan size_t
dan ptrdiff_t
ditambahkan ke Standar pada akhir 80-an, dan menjadi usang ketika C99 menambahkan banyak jenis baru tetapi belum hilang (seperti Windows 16-bit). X86 dalam mode terproteksi 16-bit memiliki memori tersegmentasi di mana susunan atau struktur terbesar yang mungkin hanya berukuran 65.536 byte, tetapi far
penunjuk harus lebar 32 bit, lebih lebar dari register. Pada mereka, intptr_t
akan menjadi lebar 32 bit tetapi size_t
danptrdiff_t
bisa 16 bit lebar dan muat dalam register. Dan siapa yang tahu sistem operasi apa yang mungkin ditulis di masa depan? Secara teori, arsitektur i386 menawarkan model segmentasi 32-bit dengan pointer 48-bit yang tidak pernah digunakan oleh sistem operasi.
Jenis offset memori tidak mungkin long
karena terlalu banyak kode lama mengasumsikan bahwa long
persis 32 bit. Asumsi ini bahkan dibangun ke dalam UNIX dan Windows API. Sayangnya, banyak kode lawas lainnya juga berasumsi bahwa a long
cukup lebar untuk menampung sebuah pointer, sebuah file offset, jumlah detik yang telah berlalu sejak tahun 1970, dan seterusnya. POSIX sekarang menyediakan cara terstandardisasi untuk memaksakan asumsi yang terakhir menjadi benar, bukan yang sebelumnya, tetapi tidak ada asumsi portabel untuk dibuat.
Itu tidak mungkin int
karena hanya segelintir kompiler di tahun 90-an yang membuat int
lebar 64 bit. Kemudian mereka benar-benar aneh dengan menjaga long
lebar 32 bit. Revisi Standar berikutnya menyatakan ilegal untuk int
menjadi lebih luas daripada long
, tetapi int
masih lebar 32 bit pada kebanyakan sistem 64-bit.
Tidak mungkin long long int
, yang bagaimanapun ditambahkan kemudian, karena itu dibuat setidaknya 64 bit lebar bahkan pada sistem 32-bit.
Jadi, diperlukan tipe baru. Bahkan jika tidak, semua tipe lainnya berarti sesuatu selain offset dalam array atau objek. Dan jika ada satu pelajaran dari kegagalan migrasi 32-ke-64-bit, itu harus spesifik tentang properti jenis apa yang perlu dimiliki, dan tidak menggunakan satu yang berarti berbeda dalam program yang berbeda.
int
jikasome_size
ditandatangani,size_t
jika tidak ditandatangani.