จะเข้าไปทำไม size_t
ต้องมีอยู่และวิธีที่เรามาที่นี่:
ในแง่ปฏิบัติsize_t
และptrdiff_t
รับประกันว่าจะมีความกว้าง 64 บิตในการใช้งานแบบ 64 บิต, 32 บิตในการใช้งานแบบ 32 บิตและอื่น ๆ พวกเขาไม่สามารถบังคับประเภทที่มีอยู่ให้หมายความว่าในคอมไพเลอร์ทุกตัวโดยไม่ทำลายรหัสดั้งเดิม
size_t
หรือptrdiff_t
ไม่จำเป็นต้องเหมือนกับหรือintptr_t
uintptr_t
พวกเขาแตกต่างกันไปตามสถาปัตยกรรมบางประเภทที่ยังคงใช้งานอยู่เมื่อsize_t
และptrdiff_t
ถูกเพิ่มลงในมาตรฐานในช่วงปลายยุค 80 และล้าสมัยเมื่อ C99 ได้เพิ่มประเภทใหม่จำนวนมาก แต่ยังไม่ได้หายไป (เช่น Windows 16 บิต) x86 ในโหมดการป้องกันแบบ 16 บิตมีหน่วยความจำแบบแบ่งส่วนซึ่งอาร์เรย์หรือโครงสร้างที่ใหญ่ที่สุดที่เป็นไปได้อาจมีขนาดเพียง 65,536 ไบต์ แต่far
ตัวชี้จำเป็นต้องมีความกว้าง 32 บิตซึ่งกว้างกว่ารีจิสเตอร์ ในนั้นintptr_t
จะได้รับ 32 บิตกว้าง แต่size_t
และptrdiff_t
อาจมีขนาด 16 บิตและพอดีกับการลงทะเบียน และใครจะรู้ว่าระบบปฏิบัติการแบบไหนที่จะถูกเขียนในอนาคต ในทางทฤษฎีแล้วสถาปัตยกรรม i386 เสนอรูปแบบการแบ่งเซ็กเมนต์ 32 บิตพร้อมพอยน์เตอร์ 48 บิตที่ไม่เคยใช้ระบบปฏิบัติการมาก่อน
ประเภทของออฟเซ็ตหน่วยความจำอาจไม่เป็นlong
เพราะรหัสดั้งเดิมมากเกินไปถือว่าlong
มีความกว้าง 32 บิต สมมติฐานนี้ถูกสร้างขึ้นใน UNIX และ Windows APIs น่าเสียดายที่รหัสมรดกอื่น ๆ จำนวนมากยังสันนิษฐานว่า a long
นั้นกว้างพอที่จะถือพอยน์เตอร์ออฟเซ็ตไฟล์จำนวนวินาทีที่ผ่านไปตั้งแต่ปี 1970 เป็นต้นไป ตอนนี้ POSIX จัดเตรียมวิธีที่เป็นมาตรฐานในการบังคับให้การสันนิษฐานหลังเป็นจริงแทนที่จะเป็นแบบดั้งเดิม แต่ก็ไม่ใช่การสันนิษฐานแบบพกพา
อาจเป็นint
เพราะคอมไพเลอร์เพียงเล็กน้อยเท่านั้นในยุค 90 ที่มีint
ความกว้าง 64 บิต จากนั้นพวกเขาก็ประหลาดจริง ๆ ด้วยการรักษาlong
ความกว้าง 32 บิต การแก้ไขมาตรฐานครั้งต่อไปประกาศว่าเป็นการผิดกฎหมายint
ที่จะกว้างกว่าlong
แต่int
ยังคงกว้าง 32 บิตในระบบ 64 บิตส่วนใหญ่
ไม่สามารถทำได้long long int
ซึ่งเพิ่มเข้ามาในภายหลังเนื่องจากถูกสร้างให้มีความกว้างอย่างน้อย 64 บิตแม้ในระบบ 32 บิต
ดังนั้นจำเป็นต้องมีรูปแบบใหม่ แม้ว่าจะไม่ใช่ประเภทอื่นทั้งหมดนั้นก็มีความหมายอย่างอื่นที่ไม่ใช่ออฟเซ็ตภายในอาร์เรย์หรือวัตถุ และถ้ามีบทเรียนหนึ่งจากความล้มเหลวของการโยกย้ายแบบ 32-64- บิตมันจะต้องเจาะจงเกี่ยวกับคุณสมบัติของประเภทที่จำเป็นต้องมีและไม่ใช้อย่างใดอย่างหนึ่งที่หมายถึงสิ่งที่แตกต่างกันในโปรแกรมที่แตกต่างกัน
int
หากsome_size
ลงชื่อsize_t
ถ้ายังไม่ได้ลงนาม