c++ - हस्ताक्षर int बनाम size_t




size-t (6)

Size_t प्रकार आकार ऑपरेटर द्वारा लौटाया गया प्रकार है। यह मेजबान मशीन पर समर्थित किसी भी मेमोरी रेंज के बाइट्स में आकार को व्यक्त करने में सक्षम एक हस्ताक्षरित पूर्णांक है। यह (आमतौर पर) ptrdiff_t से संबंधित है ptrdiff_t एक हस्ताक्षरित पूर्णांक मान है जैसे आकार (ptrdiff_t) और sizeof (size_t) बराबर हैं।

सी कोड लिखते समय आपको स्मृति श्रेणियों से निपटने के दौरान हमेशा size_t का उपयोग करना चाहिए।

दूसरी तरफ int प्रकार मूल रूप से (हस्ताक्षरित) पूर्णांक मान के आकार के रूप में परिभाषित किया जाता है जिसे मेजबान मशीन सबसे कुशलतापूर्वक पूर्णांक अंकगणित करने के लिए उपयोग कर सकती है। उदाहरण के लिए, कई पुराने पीसी प्रकार कंप्यूटरों पर मूल्य आकार (size_t) 4 (बाइट्स) होगा लेकिन आकार (int) 2 (बाइट) होगा। 16 बिट अंकगणितीय 32 बिट अंकगणितीय से तेज था, हालांकि सीपीयू 4 जीबी तक की एक (लॉजिकल) मेमोरी स्पेस को संभाल सकता था।

केवल int प्रकार का उपयोग करें जब आप दक्षता की परवाह करते हैं क्योंकि इसकी वास्तविक परिशुद्धता दोनों कंपाइलर विकल्पों और मशीन आर्किटेक्चर पर दृढ़ता से निर्भर करती है। विशेष रूप से सी मानक निम्नलिखित आविष्कारों को निर्दिष्ट करता है: आकार (char) <= sizeof (छोटा) <= sizeof (int) <= sizeof (long) प्रत्येक के लिए प्रोग्रामर के लिए उपलब्ध परिशुद्धता के वास्तविक प्रतिनिधित्व पर कोई अन्य सीमाएं नहीं रखता इन आदिम प्रकार।

नोट: यह जावा में समान नहीं है (जो वास्तव में प्रत्येक प्रकार के 'चार', 'बाइट', 'शॉर्ट', 'int' और 'long' के लिए थोड़ा सटीकता निर्दिष्ट करता है)।

मुझे पता है कि आधुनिक सी और सी ++ कोड int / unsigned int बजाय size_t का उपयोग करने के लिए लगता है - सी स्ट्रिंग कार्यों के लिए पैरामीटर से एसटीएल तक। मैं इस कारण और इसके द्वारा लाए जाने वाले लाभों के कारण उत्सुक हूं।


size_t एक सूचक का आकार है।

तो 32 बिट्स या आम आईएलपी 32 (पूर्णांक, लंबा, सूचक) मॉडल size_t 32 बिट्स में है। और 64 बिट्स या सामान्य एलपी 64 (लम्बा, सूचक) मॉडल आकार_टी 64 बिट्स (पूर्णांक अभी भी 32 बिट्स हैं) में।

अन्य मॉडल भी हैं लेकिन ये वे हैं जिन्हें g ++ उपयोग (कम से कम डिफ़ॉल्ट रूप से)


क्लासिक सी (द सी प्रोग्रामिंग लैंग्वेज, ब्रेंटिस-हॉल, 1 9 78 में ब्रायन कर्निघन और डेनिस रिची द्वारा वर्णित सी की प्रारंभिक बोली) आकार_टी प्रदान नहीं की गई। सी मानकों समिति ने पोर्टेबिलिटी समस्या को खत्म करने के लिए size_t पेश किया

Embedded.com पर विस्तार से समझाया गया (एक बहुत अच्छा उदाहरण के साथ)


यदि मेरा कंपाइलर 32 बिट पर सेट है, तो size_t बिना हस्ताक्षर किए गए int के लिए टाइपेडफ के अलावा कुछ भी नहीं है। यदि मेरा कंपाइलर 64 बिट पर सेट है, तो size_t बिना किसी लंबे समय तक हस्ताक्षर किए गए टाइप किए गए टाइप के अलावा कुछ भी नहीं है।


संक्षेप में, size_t कभी नकारात्मक नहीं होता है, और यह प्रदर्शन को अधिकतम करता है क्योंकि यह टाइप किए गए पूर्णांक प्रकार के लिए टाइप किया गया है जो कि काफी बड़ा है - लेकिन बहुत बड़ा नहीं - लक्ष्य प्लेटफ़ॉर्म पर सबसे बड़ी संभावित वस्तु के आकार का प्रतिनिधित्व करने के लिए।

आकार कभी नकारात्मक नहीं होना चाहिए, और वास्तव में size_t एक हस्ताक्षरित प्रकार है। साथ ही, क्योंकि size_t को हस्ताक्षरित किया गया है, इसलिए आप उन संख्याओं को संग्रहीत कर सकते हैं जो संबंधित हस्ताक्षरित प्रकार के रूप में लगभग दोगुनी बड़ी हैं, क्योंकि हम हस्ताक्षर पूर्णांक में अन्य सभी बिट्स की तरह परिमाण का प्रतिनिधित्व करने के लिए साइन बिट का उपयोग कर सकते हैं। जब हम एक और बिट प्राप्त करते हैं, तो हम उन संख्याओं की सीमा को गुणा कर रहे हैं जिन्हें हम लगभग दो कारकों द्वारा प्रस्तुत कर सकते हैं।

तो, आप पूछते हैं, क्यों न सिर्फ एक unsigned int उपयोग करें? यह बड़ी संख्या में पर्याप्त संख्या में सक्षम नहीं हो सकता है। एक कार्यान्वयन में जहां unsigned int 32 बिट्स हैं, सबसे बड़ी संख्या यह प्रतिनिधित्व कर सकती है 4294967295 । कुछ प्रोसेसर, जैसे आईपी 16 एल 32, 42 9 4 9 672 9 5 बाइट्स से बड़ी वस्तुओं की प्रतिलिपि बना सकते हैं।

तो, आप पूछते हैं, क्यों एक unsigned long int उपयोग नहीं करते? यह कुछ प्लेटफार्मों पर एक प्रदर्शन टोल सटीक है। मानक सी की आवश्यकता है कि कम से कम 32 बिट्स पर कब्जा कर लें। एक आईपी 16 एल 32 प्लेटफार्म प्रत्येक 32-बिट लंबे 16-बिट शब्दों की एक जोड़ी के रूप में लागू करता है। इन प्लेटफार्मों पर लगभग सभी 32-बिट ऑपरेटरों को दो निर्देशों की आवश्यकता होती है, यदि अधिक नहीं, क्योंकि वे 32 बिट्स के साथ दो 16-बिट भाग में काम करते हैं। उदाहरण के लिए, 32-बिट लंबे समय तक चलने के लिए आमतौर पर दो मशीन निर्देशों की आवश्यकता होती है - प्रत्येक 16-बिट खंड को स्थानांतरित करने के लिए।

Size_t का उपयोग इस प्रदर्शन टोल से बचाता है। इस शानदार लेख के मुताबिक, "टाइप आकार_टी एक टाइपिफ़ है जो कुछ हस्ताक्षरित पूर्णांक प्रकार के लिए उपनाम है, आमतौर पर बिना हस्ताक्षर किए गए int या हस्ताक्षरित लंबे, लेकिन संभवतः यहां तक ​​कि लंबे समय तक हस्ताक्षर किए गए हैं। प्रत्येक मानक सी कार्यान्वयन को असाइन किए गए पूर्णांक को चुनना होता है जो कि काफी बड़ा है- - लेकिन आवश्यक प्लेटफॉर्म पर सबसे बड़ी संभावित वस्तु के आकार का प्रतिनिधित्व करने के लिए आवश्यक नहीं है। "


size_t प्रकार हस्ताक्षरित पूर्णांक प्रकार है जो sizeof ऑपरेटर (और offsetof ऑपरेटर) का परिणाम है, इसलिए यह आपके सिस्टम को संभालने वाली सबसे बड़ी ऑब्जेक्ट का आकार रखने के लिए काफी बड़ा होने की गारंटी है (उदाहरण के लिए, एक स्थिर सरणी 8Gb)।

size_t प्रकार एक unsigned int से बड़ा, बराबर या छोटा हो सकता है, और आपका कंपाइलर अनुकूलन के लिए इसके बारे में धारणाएं कर सकता है।

आपको सी 99 मानक, धारा 7.17 में अधिक सटीक जानकारी मिल सकती है, जिसका एक मसौदा pdf प्रारूप में इंटरनेट पर उपलब्ध है, या सी 11 मानक, धारा 7.1 9 में, पीडीएफ ड्राफ्ट के रूप में भी उपलब्ध है।





size-t