Neden size_tvar olmamız gerektiğine ve buraya nasıl geldiğimize bakmak için:
Pragmatik olarak size_tve ptrdiff_t64 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_tveya ptrdiff_tmutlaka bir intptr_tveya ile aynı değildir uintptr_t. Onlar hala kullanımda iken belirli mimarileri farklı idi size_tve 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 farişaretçinin kayıtlardan daha geniş, 32 bit genişliğinde olması gerekiyordu. Bunlarda, intptr_t32 bit genişliğinde olurdu size_tveptrdiff_t16 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 longtam 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 longbir 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 intnedeni, 90'larda sadece küçük bir avuç derleyici int64 bit genişliğinde yapıldı. Sonra long32 bit geniş tutarak tuhaflaştılar . Standardın bir sonraki revizyonu, intdaha geniş olduğu için yasadışı ilan etti long, ancak intçoğu 64 bit sistemde hala 32 bit genişliğinde.
long long int32 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ı.
intdurumundasome_size, imzalanırsize_to imzasız ise.