Neden size_t
var olmamız gerektiğine ve buraya nasıl geldiğimize bakmak için:
Pragmatik olarak size_t
ve ptrdiff_t
64 bitlik bir uygulamada 64 bit genişlik, 32 bitlik bir uygulamada 32 bit genişlik ve benzeri garanti edilir. Mevcut herhangi bir türü, her derleyicide eski kodu bozmadan anlamına gelmeye zorlayamazlardı.
A size_t
veya ptrdiff_t
mutlaka bir intptr_t
veya ile aynı değildir uintptr_t
. Onlar hala kullanımda iken belirli mimarileri farklı idi size_t
ve ptrdiff_t
(örneğin 16 bit Windows gibi) 80'lerin sonlarına Standard ilave edildi ve C99 birçok yeni türü eklendiğinde modası geçmekte ancak henüz gitmiş değil. 16 bit korumalı modda x86, mümkün olan en büyük dizi veya yapının yalnızca 65.536 bayt boyutunda olabileceği bölümlere ayrılmış bir belleğe sahipti, ancak bir far
işaretçinin kayıtlardan daha geniş, 32 bit genişliğinde olması gerekiyordu. Bunlarda, intptr_t
32 bit genişliğinde olurdu size_t
veptrdiff_t
16 bit genişliğinde ve bir sicile sığabilir. Ve gelecekte ne tür bir işletim sisteminin yazılabileceğini kim bilebilirdi? Teorik olarak, i386 mimarisi, hiçbir işletim sisteminin gerçekte kullanmadığı 48 bitlik işaretçilerle 32 bitlik bir segmentasyon modeli sunar.
Bellek ofsetinin türü, long
çok fazla eski kodun long
tam olarak 32 bit genişlikte olduğunu varsaydığı için olamaz . Bu varsayım UNIX ve Windows API'larında da oluşturulmuştur. Ne yazık ki, diğer birçok eski kod da a'nın long
bir işaretçi, bir dosya ofseti, 1970'ten bu yana geçen saniye sayısı ve daha fazlasını tutacak kadar geniş olduğunu varsaymıştır . POSIX şimdi, ikinci varsayımı öncekinin yerine doğru olmaya zorlamak için standart bir yol sunmaktadır, ancak bunların hiçbiri taşınabilir bir varsayım değildir.
Bunun int
nedeni, 90'larda sadece küçük bir avuç derleyici int
64 bit genişliğinde yapıldı. Sonra long
32 bit geniş tutarak tuhaflaştılar . Standardın bir sonraki revizyonu, int
daha geniş olduğu için yasadışı ilan etti long
, ancak int
çoğu 64 bit sistemde hala 32 bit genişliğinde.
long long int
32 bitlik sistemlerde bile en az 64 bit genişliğinde yaratıldığı için daha sonra eklenmiş olamazdı .
Yani yeni bir tipe ihtiyaç vardı. Olmasa bile, diğer tüm türler bir dizi veya nesne içindeki bir ofsetten başka bir şey ifade ediyordu. Ve 32-64 bit geçişinin fiyaskosundan bir ders olsaydı, bir türün hangi özelliklere sahip olması gerektiği konusunda spesifik olmalı ve farklı programlarda farklı şeyler ifade eden bir özellik kullanmamalıydı.
int
durumundasome_size
, imzalanırsize_t
o imzasız ise.