size_t
अस्तित्व में रहने की आवश्यकता क्यों है और हम यहां कैसे पहुंचे:
व्यावहारिक शब्दों में, size_t
और ptrdiff_t
64-बिट कार्यान्वयन पर 64 बिट्स विस्तृत होने की गारंटी है, 32 बिट्स एक 32-बिट कार्यान्वयन पर, और इसी तरह। वे किसी भी मौजूदा प्रकार को यह कहने के लिए मजबूर नहीं कर सकते थे कि, प्रत्येक संकलक पर, बिना विरासत कोड को तोड़ने के।
एक size_t
या ptrdiff_t
आवश्यक रूप से के रूप में ही नहीं है intptr_t
या uintptr_t
। वे कुछ निश्चित आर्किटेक्चर पर भिन्न थे जो 80 के दशक के उत्तरार्ध में अभी भी उपयोग में थे size_t
और ptrdiff_t
मानक में जोड़े गए थे, और अप्रचलित हो रहे थे जब C99 ने कई नए प्रकार जोड़े लेकिन अभी तक नहीं गए (जैसे कि 16-बिट विंडोज)। 16-बिट संरक्षित मोड में x86 में खंडित मेमोरी थी जहां सबसे बड़ा संभव सरणी या संरचना आकार में केवल 65,536 बाइट्स हो सकती है, लेकिन far
रजिस्टरों की तुलना में 32 बिट्स चौड़ा होने के लिए एक सूचक की आवश्यकता होती है। उन पर, intptr_t
32 बिट्स चौड़े होंगे लेकिन size_t
औरptrdiff_t
एक रजिस्टर में 16 बिट्स चौड़े और फिट हो सकते हैं। और कौन जानता था कि भविष्य में किस तरह का ऑपरेटिंग सिस्टम लिखा जा सकता है? सिद्धांत रूप में, i386 आर्किटेक्चर 48-बिट पॉइंटर्स के साथ 32-बिट सेगमेंटेशन मॉडल प्रदान करता है जिसे किसी भी ऑपरेटिंग सिस्टम ने वास्तव में उपयोग नहीं किया है।
एक मेमोरी ऑफ़सेट का प्रकार नहीं हो सकता है long
क्योंकि अभी तक बहुत अधिक विरासत कोड मानता है कि long
वास्तव में 32 बिट्स चौड़ा है। इस धारणा को UNIX और Windows API में भी बनाया गया था। दुर्भाग्य से, बहुत सारी अन्य विरासत कोड ने यह भी माना कि एक long
पॉइंटर को पकड़ने के लिए पर्याप्त चौड़ा है, एक फ़ाइल ऑफसेट, सेकंड की संख्या जो 1970 के बाद से समाप्त हो गई है, और इसी तरह। POSIX अब पूर्व की बजाय बाद की धारणा को सच होने के लिए मजबूर करने के लिए एक मानकीकृत तरीका प्रदान करता है, लेकिन न तो बनाने के लिए एक पोर्टेबल धारणा है।
यह int
इसलिए नहीं हो सका क्योंकि 90 के दशक में int
64 बिट्स के चौड़े हिस्से में केवल कुछ मुट्ठी भर कंपाइलर थे । फिर वे long
32 बिट्स को चौड़ा करके वास्तव में अजीब हो गए । मानक के अगले संशोधन ने इसे int
अधिक से अधिक व्यापक होने के लिए अवैध घोषित किया long
, लेकिन int
अभी भी अधिकांश 64-बिट सिस्टम पर 32 बिट्स चौड़ा है।
यह नहीं हो सकता है long long int
, जो वैसे भी बाद में जोड़ा गया था, क्योंकि यह 32-बिट सिस्टम पर भी कम से कम 64 बिट्स चौड़ा होने के लिए बनाया गया था।
इसलिए, एक नए प्रकार की आवश्यकता थी। यहां तक कि अगर यह नहीं थे, तो उन सभी अन्य प्रकारों का मतलब एक सरणी या वस्तु के भीतर ऑफसेट के अलावा कुछ और था। और अगर 32-से-64-बिट माइग्रेशन के फ़िस्को से एक सबक था, तो यह विशिष्ट होना चाहिए कि किस प्रकार के गुणों के लिए आवश्यक गुण हैं, और एक का उपयोग न करें जो विभिन्न कार्यक्रमों में अलग-अलग चीजों का मतलब है।
int
तो यदिsome_size
हस्ताक्षर किए गए हैं,size_t
तो इसका उपयोग करें ।