मैं इस प्रकार से परिभाषित चर देखता हूं, लेकिन मुझे नहीं पता कि यह कहां से आता है, न ही इसका उद्देश्य क्या है। Int या अहस्ताक्षरित int का उपयोग क्यों नहीं करते? (अन्य "समान" प्रकारों के बारे में क्या? Void_t, आदि)।
मैं इस प्रकार से परिभाषित चर देखता हूं, लेकिन मुझे नहीं पता कि यह कहां से आता है, न ही इसका उद्देश्य क्या है। Int या अहस्ताक्षरित int का उपयोग क्यों नहीं करते? (अन्य "समान" प्रकारों के बारे में क्या? Void_t, आदि)।
जवाबों:
से विकिपीडिया
stdlib.hऔरstddef.hहेडर फाइल एक डेटाप्रकार बुलाया परिभाषितsize_t1 जो एक वस्तु के आकार का प्रतिनिधित्व करने के लिए किया जाता है। लाइब्रेरी फ़ंक्शंस जो आकार लेते हैं उनसे अपेक्षा करते हैं कि वे प्रकार के होंsize_t, और आकार- प्रकार ऑपरेटर उनका मूल्यांकन करता हैsize_t।वास्तविक प्रकार का
size_tप्लेटफ़ॉर्म-निर्भर है; एक सामान्य गलती यह है किsize_tअहस्ताक्षरित int के समान है, जो प्रोग्रामिंग त्रुटियों को जन्म दे सकता है, 2 विशेष रूप से 64-बिट आर्किटेक्चर अधिक प्रचलित हो जाते हैं।
निम्न प्रकार और मैक्रोज़ मानक हेडर में परिभाषित किए गए हैं
stddef.h<स्निप>
size_tजो आकार के ऑपरेटर के परिणाम का अहस्ताक्षरित पूर्णांक प्रकार है
intऔर unsigned intप्रकार 32 बिट्स हैं, जबकि size_t 64 बिट्स हैं।
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>
size_t साइज़ोफ़ ऑपरेटर (ISO C99 सेक्शन 7.17) के परिणाम का अहस्ताक्षरित पूर्णांक प्रकार है।
sizeofऑपरेटर अपनी संकार्य के आकार (बाइट्स में) है, जो एक अभिव्यक्ति या एक प्रकार की parenthesized नाम हो सकता है अर्जित करता है। आकार ऑपरेंड के प्रकार से निर्धारित होता है। परिणाम एक पूर्णांक है। परिणाम का मूल्य कार्यान्वयन-डे and ned है, और इसका प्रकार (एक अहस्ताक्षरित पूर्णांक प्रकार) है size_t(ISO C99 धारा 6.5.3.4)।
व्यावहारिक रूप से बोलना size_tबाइट्स की संख्या को दर्शाता है जिसे आप संबोधित कर सकते हैं। पिछले 10-15 वर्षों में अधिकांश आधुनिक आर्किटेक्चर में 32 बिट्स रहे हैं जो एक अहस्ताक्षरित इंट का आकार भी रहा है। हालाँकि हम 64bit पते पर जा रहे हैं, जबकि uintसबसे अधिक संभावना 32 बिट्स पर रहेगी (यह आकार c ++ मानक में गारंटी नहीं है)। अपना कोड बनाने के लिए जो आर्किटेक्चर में मेमोरी साइज पोर्टेबल पर निर्भर करता है, आपको इसका उपयोग करना चाहिए size_t। उदाहरण के लिए सरणी आकार जैसी चीजों का हमेशा उपयोग करना चाहिएsize_t । यदि आप मानक कंटेनरों को देखते हैं तो ::size()हमेशा रिटर्न होता है size_t।
यह भी ध्यान दें, दृश्य स्टूडियो में एक संकलन विकल्प है जो इस प्रकार की त्रुटियों के लिए जांच कर सकता है जिसे "64-बिट पोर्टेबिलिटी इश्यूज डिटेक्ट करें" कहा जाता है।
इस तरह आप हमेशा जानते हैं कि आकार क्या है, क्योंकि एक विशिष्ट प्रकार आकार के लिए समर्पित है। बहुत ही सवाल से पता चलता है कि यह एक मुद्दा हो सकता है: यह एक 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वापसी के आकार और लंबाई करने के लिए।
size_t को आपके मानक पुस्तकालय के शीर्षलेखों में परिभाषित किया जाना चाहिए। मेरे अनुभव में, यह आम तौर पर अहस्ताक्षरित int के लिए एक टाइपडिफ़ है। हालाँकि, यह है कि यह होना जरूरी नहीं है। Size_t जैसे प्रकार मानक लाइब्रेरी विक्रेता को प्लेटफ़ॉर्म के लिए उपयुक्त होने पर अपने अंतर्निहित डेटा प्रकारों को बदलने की स्वतंत्रता देते हैं। यदि आप मानते हैं कि size_t हमेशा अहस्ताक्षरित int (कास्टिंग, आदि के माध्यम से) होता है, तो आप भविष्य में समस्याओं में भाग सकते हैं यदि आपका विक्रेता size_t को बदल देता है जैसे कि 64-बिट प्रकार। इस या किसी अन्य पुस्तकालय प्रकार के बारे में इस कारण से कुछ भी मानना खतरनाक है।
मैं परिचित के साथ नहीं कर रहा हूँ void_tएक गूगल खोज के परिणाम स्वरूप को छोड़कर (उस में प्रयोग किया जाता है एक vmallocएटी एंड टी रिसर्च में Kiem-फोंग वो द्वारा पुस्तकालय - मुझे यकीन है कि यह अच्छी तरह से अन्य पुस्तकालयों में प्रयोग किया जाता है कर रहा हूँ)।
विभिन्न xxx_t टाइपडिफ का उपयोग एक विशेष निश्चित कार्यान्वयन से एक प्रकार का सार करने के लिए किया जाता है, क्योंकि कुछ चीजों के लिए उपयोग किए जाने वाले ठोस प्रकार एक मंच से दूसरे में भिन्न हो सकते हैं। उदाहरण के लिए:
Void_tvmallocलाइब्रेरी रूटीन द्वारा दिए गए पॉइंटर के प्रकार को एब्सट्रैक्ट करता है क्योंकि यह सिस्टम पर काम करने के लिए लिखा गया था जो एएनएसआई / प्री-डेट से पहले केvoid कीवर्ड मौजूद नहीं हो सकता है। कम से कम मैं यही अनुमान लगाऊंगा।wchar_t एब्सट्रैक्ट्स का इस्तेमाल विस्तृत वर्णों के लिए किया जाता है क्योंकि कुछ सिस्टम पर यह 16 बिट प्रकार का होगा, अन्य पर यह 32 बिट प्रकार का होगा।इसलिए यदि आप wchar_tटाइप करने के बजाय अपने वाइड कैरेक्टर हैंडलिंग कोड लिखते हैं unsigned short, तो यह कहें कि वह कोड संभवतः विभिन्न प्लेटफार्मों पर अधिक पोर्टेबल होगा।
न्यूनतर कार्यक्रमों में जहां एक size_tपरिभाषा को "संयोग से" लोड नहीं किया गया था, लेकिन कुछ में मुझे अभी भी कुछ संदर्भ (उदाहरण के लिए उपयोग करने के लिए std::vector<double>) की आवश्यकता है, फिर मैं उस संदर्भ का उपयोग सही प्रकार निकालने के लिए करता हूं । उदाहरण के लिए typedef std::vector<double>::size_type size_t।
( namespace {...}यदि दायरे को सीमित करने के लिए आवश्यक हो तो चारों ओर से घेर लें।)
के रूप में "क्यों int या अहस्ताक्षरित int का उपयोग नहीं करते?", सिर्फ इसलिए कि यह शब्दार्थ से अधिक सार्थक है नहीं। इसका व्यावहारिक कारण यह है कि यह कहा जा सकता है कि, typedefएक के रूप में घ intऔर फिर बाद में अपग्रेड किया longगया, बिना किसी को अपना कोड बदलने के लिए, निश्चित रूप से, लेकिन इससे अधिक मौलिक रूप से एक प्रकार का अर्थ माना जाता है। बड़े पैमाने पर सरलीकरण करने size_tके लिए, प्रकार का एक चर के लिए उपयुक्त है, और चीजों के आकार वाले के time_tलिए उपयुक्त है , जैसे समय मान रखने के लिए उपयुक्त है। इनको वास्तव में कैसे लागू किया जाता है, यह ठीक से कार्यान्वयन का काम होना चाहिए। बस सब कुछ कॉल करने की तुलना में int, इस प्रकार सार्थक टाइपनेम का उपयोग करने से आपके प्रोग्राम के अर्थ और इरादे को स्पष्ट करने में मदद मिलती है, ठीक उसी तरह जैसे किसी भी प्रकार का समृद्ध सेट करता है।