मुझे size_t की परिभाषा कहां मिलती है?


123

मैं इस प्रकार से परिभाषित चर देखता हूं, लेकिन मुझे नहीं पता कि यह कहां से आता है, न ही इसका उद्देश्य क्या है। Int या अहस्ताक्षरित int का उपयोग क्यों नहीं करते? (अन्य "समान" प्रकारों के बारे में क्या? Void_t, आदि)।


सटीक प्रश्न: stackoverflow.com/questions/502856/…
kjfletch

@kjfletch: hhhmmm, यह अजीब है कि शब्द 'size_t' के लिए खोज (जैसा कि मैंने पहले किया था) उस प्रश्न को वापस नहीं किया।
एलिसेओ ओकाम्पोस

1
@Eliseo - Stackoverflow का खोज कार्य भयानक है। इसके बजाय 'साइट: stackoverflow.com' पैरामीटर के साथ Google का उपयोग करें।
माइकल बूर

8
ओपी ने विशेष रूप से पूछा कि मुझे size_t की परिभाषा कहां मिलती है? मैं उसी चीज को खोजता हुआ यहां पहुंचा। उद्धृत द्वंद्व में यह घोषणा नहीं की गई है कि घोषणा को कहां खोजा जाए।
jww

9
यह प्रश्न स्पष्ट रूप से एक ही प्रश्न नहीं है जैसा कि एक जुड़ा हुआ है। "मुझे कुछ कहां मिलेगा" "क्या अंतर है" के समान नहीं है (भले ही एक का जवाब दूसरे को उत्तर प्रदान करता हो)। मेरी Google खोज 'c ++ जहाँ size_t परिभाषा' है, मुझे सीधे यहाँ ले गई, और मुझे दूसरा प्रश्न याद नहीं होगा, क्योंकि यह अलग है
डेन निसेनबौम

जवाबों:


122

से विकिपीडिया

stdlib.hऔर stddef.hहेडर फाइल एक डेटाप्रकार बुलाया परिभाषित size_t1 जो एक वस्तु के आकार का प्रतिनिधित्व करने के लिए किया जाता है। लाइब्रेरी फ़ंक्शंस जो आकार लेते हैं उनसे अपेक्षा करते हैं कि वे प्रकार के हों size_t, और आकार- प्रकार ऑपरेटर उनका मूल्यांकन करता है size_t

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

से C99 7.17.1 / 2

निम्न प्रकार और मैक्रोज़ मानक हेडर में परिभाषित किए गए हैं stddef.h

<स्निप>

size_t

जो आकार के ऑपरेटर के परिणाम का अहस्ताक्षरित पूर्णांक प्रकार है


2
उदाहरण के लिए, Win64 पर, intऔर unsigned intप्रकार 32 बिट्स हैं, जबकि size_t 64 बिट्स हैं।
माइकल बूर

7
कृपया ISO C (99) मानक (जिसमें से C ++ मानक शामिल हैं) खंड 7.17 और 7.18.3 का उल्लेख करें
मार्टिन

3
@LokiAstari जब आप यह जानते हैं कि जब आप मानक में लिखे गए हैं, तो आप केवल उत्तर क्यों नहीं संपादित करते हैं?
हाय-एंजेल

तो C ++ उत्तर कहाँ है?
लोथर

@ लोथर मुझे लगता है कि अंतर केवल यह है कि size_t एक कीवर्ड हो सकता है, और अन्यथा इसका एक ही अर्थ है।
पॉल स्टेलियन

30

En.cppreference.com पर size_t विवरण के अनुसार size_tनिम्नलिखित हेडर में परिभाषित किया गया है:

std::size_t

...    

Defined in header <cstddef>         
Defined in header <cstdio>      
Defined in header <cstring>         
Defined in header <ctime>       
Defined in header <cwchar>

2
यह वही है जो मुझे चाहिए था, इस जवाब को ऊपर उठाना चाहिए।
नियोडेल्फी

27

size_t साइज़ोफ़ ऑपरेटर (ISO C99 सेक्शन 7.17) के परिणाम का अहस्ताक्षरित पूर्णांक प्रकार है।

sizeofऑपरेटर अपनी संकार्य के आकार (बाइट्स में) है, जो एक अभिव्यक्ति या एक प्रकार की parenthesized नाम हो सकता है अर्जित करता है। आकार ऑपरेंड के प्रकार से निर्धारित होता है। परिणाम एक पूर्णांक है। परिणाम का मूल्य कार्यान्वयन-डे and ned है, और इसका प्रकार (एक अहस्ताक्षरित पूर्णांक प्रकार) है size_t(ISO C99 धारा 6.5.3.4)।


सबसे अच्छा जवाब यह मानक को उद्धृत करता है।
मार्टिन

1
@Martin - काफी हद तक सही है, लेकिन मुझे लगता है कि 'अहस्ताक्षरित int का उपयोग क्यों नहीं किया गया है' सवाल का हिस्सा उतना ही दिलचस्प (या अधिक) है जैसा कि 'size_t' भाग है, और आप इसे मानक में नहीं पाएंगे ।
माइकल बूर

हां, सिवाय इसके कि कोई 'धारा 17.17 ' नहीं है: पी। यह दुर्लभ है, किसी ने भी Void_t के बारे में एक शब्द नहीं कहा
एलीसो ओकैम्पोस

मैं इस जवाब को स्वीकार करता हूं क्योंकि यह सीधे सवाल का जवाब देता है, लेकिन यह बहुत अच्छा होगा अगर इसे माइकल के जवाब से सराहा जाए।
एलिसा ओसेम्पोस

58
अपने जवाब पर दया न करें कि मुझे क्या हैडर फ़ाइल को शामिल करना है।
मैट

6

व्यावहारिक रूप से बोलना size_tबाइट्स की संख्या को दर्शाता है जिसे आप संबोधित कर सकते हैं। पिछले 10-15 वर्षों में अधिकांश आधुनिक आर्किटेक्चर में 32 बिट्स रहे हैं जो एक अहस्ताक्षरित इंट का आकार भी रहा है। हालाँकि हम 64bit पते पर जा रहे हैं, जबकि uintसबसे अधिक संभावना 32 बिट्स पर रहेगी (यह आकार c ++ मानक में गारंटी नहीं है)। अपना कोड बनाने के लिए जो आर्किटेक्चर में मेमोरी साइज पोर्टेबल पर निर्भर करता है, आपको इसका उपयोग करना चाहिए size_t। उदाहरण के लिए सरणी आकार जैसी चीजों का हमेशा उपयोग करना चाहिएsize_t । यदि आप मानक कंटेनरों को देखते हैं तो ::size()हमेशा रिटर्न होता है size_t

यह भी ध्यान दें, दृश्य स्टूडियो में एक संकलन विकल्प है जो इस प्रकार की त्रुटियों के लिए जांच कर सकता है जिसे "64-बिट पोर्टेबिलिटी इश्यूज डिटेक्ट करें" कहा जाता है।


2

इस तरह आप हमेशा जानते हैं कि आकार क्या है, क्योंकि एक विशिष्ट प्रकार आकार के लिए समर्पित है। बहुत ही सवाल से पता चलता है कि यह एक मुद्दा हो सकता है: यह एक intया एक है unsigned int? इसके अलावा, परिमाण क्या है ( short, int, long, आदि)?

क्योंकि एक विशिष्ट प्रकार निर्दिष्ट है, आपको लंबाई या हस्ताक्षरित नेस के बारे में चिंता करने की आवश्यकता नहीं है।

वास्तविक परिभाषा C ++ संदर्भ पुस्तकालय में पाई जा सकती है , जो कहती है:

प्रकार: size_t(अहस्ताक्षरित अभिन्न प्रकार)

हैडर: <cstring>

size_t भाषा ऑपरेटर द्वारा लौटाए गए अभिन्न डेटा प्रकार से मेल खाती है sizeof और <cstring>हेडर फ़ाइल (दूसरों के बीच) में एक अहस्ताक्षरित अभिन्न प्रकार के रूप में परिभाषित किया गया है ।

में <cstring>, यह पैरामीटर के प्रकार के रूप में प्रयोग किया जाता है numकार्यों में memchr, memcmp, memcpy, memmove, memset, strncat,strncmp , strncpyऔरstrxfrm , सभी मामलों में यह बाइट या वर्ण समारोह को प्रभावित करने के लिए किया की अधिकतम संख्या निर्दिष्ट करने के लिए किया जाता है।

यह भी वापसी प्रकार के लिए के रूप में प्रयोग किया जाता है strcspn, strlen, strspnऔर strxfrmवापसी के आकार और लंबाई करने के लिए।


2

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


1

मैं परिचित के साथ नहीं कर रहा हूँ void_tएक गूगल खोज के परिणाम स्वरूप को छोड़कर (उस में प्रयोग किया जाता है एक vmallocएटी एंड टी रिसर्च में Kiem-फोंग वो द्वारा पुस्तकालय - मुझे यकीन है कि यह अच्छी तरह से अन्य पुस्तकालयों में प्रयोग किया जाता है कर रहा हूँ)।

विभिन्न xxx_t टाइपडिफ का उपयोग एक विशेष निश्चित कार्यान्वयन से एक प्रकार का सार करने के लिए किया जाता है, क्योंकि कुछ चीजों के लिए उपयोग किए जाने वाले ठोस प्रकार एक मंच से दूसरे में भिन्न हो सकते हैं। उदाहरण के लिए:

  • size_t अमूर्त वस्तुओं के आकार को धारण करने के लिए इस्तेमाल किया जाने वाला प्रकार है क्योंकि कुछ प्रणालियों पर यह एक 32-बिट मान होगा, दूसरों पर यह 16-बिट या 64-बिट हो सकता है।
  • Void_tvmallocलाइब्रेरी रूटीन द्वारा दिए गए पॉइंटर के प्रकार को एब्सट्रैक्ट करता है क्योंकि यह सिस्टम पर काम करने के लिए लिखा गया था जो एएनएसआई / प्री-डेट से पहले केvoid कीवर्ड मौजूद नहीं हो सकता है। कम से कम मैं यही अनुमान लगाऊंगा।
  • wchar_t एब्सट्रैक्ट्स का इस्तेमाल विस्तृत वर्णों के लिए किया जाता है क्योंकि कुछ सिस्टम पर यह 16 बिट प्रकार का होगा, अन्य पर यह 32 बिट प्रकार का होगा।

इसलिए यदि आप wchar_tटाइप करने के बजाय अपने वाइड कैरेक्टर हैंडलिंग कोड लिखते हैं unsigned short, तो यह कहें कि वह कोड संभवतः विभिन्न प्लेटफार्मों पर अधिक पोर्टेबल होगा।


यह वही है जो मैं देख रहा था, आंशिक रूप से। जैसा कि मैंने fpmurphy के उत्तर में एक टिप्पणी में कहा, यह बहुत अच्छा होगा कि इसे इस उत्तर के साथ पूरक किया जा सकता है (यदि आपको कोई आपत्ति नहीं है तो आप इसे संपादित कर सकते हैं) :)
Eliseo Ocampos

1

न्यूनतर कार्यक्रमों में जहां एक size_tपरिभाषा को "संयोग से" लोड नहीं किया गया था, लेकिन कुछ में मुझे अभी भी कुछ संदर्भ (उदाहरण के लिए उपयोग करने के लिए std::vector<double>) की आवश्यकता है, फिर मैं उस संदर्भ का उपयोग सही प्रकार निकालने के लिए करता हूं । उदाहरण के लिए typedef std::vector<double>::size_type size_t

( namespace {...}यदि दायरे को सीमित करने के लिए आवश्यक हो तो चारों ओर से घेर लें।)


1

के रूप में "क्यों int या अहस्ताक्षरित int का उपयोग नहीं करते?", सिर्फ इसलिए कि यह शब्दार्थ से अधिक सार्थक है नहीं। इसका व्यावहारिक कारण यह है कि यह कहा जा सकता है कि, typedefएक के रूप में घ intऔर फिर बाद में अपग्रेड किया longगया, बिना किसी को अपना कोड बदलने के लिए, निश्चित रूप से, लेकिन इससे अधिक मौलिक रूप से एक प्रकार का अर्थ माना जाता है। बड़े पैमाने पर सरलीकरण करने size_tके लिए, प्रकार का एक चर के लिए उपयुक्त है, और चीजों के आकार वाले के time_tलिए उपयुक्त है , जैसे समय मान रखने के लिए उपयुक्त है। इनको वास्तव में कैसे लागू किया जाता है, यह ठीक से कार्यान्वयन का काम होना चाहिए। बस सब कुछ कॉल करने की तुलना में int, इस प्रकार सार्थक टाइपनेम का उपयोग करने से आपके प्रोग्राम के अर्थ और इरादे को स्पष्ट करने में मदद मिलती है, ठीक उसी तरह जैसे किसी भी प्रकार का समृद्ध सेट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.