2011-08-26 10 views
10

जब मैं पूर्ण कोड के लिए कुछ कोड पढ़ता हूं, तो वे size_t, uint32, uint64 आदि जैसे विभिन्न प्रकार के समूह का उपयोग करते हैं ऐसा करने के लिए प्रेरणा या उद्देश्य क्या है? क्यों न केवल int का उपयोग करें? प्लेटफ़ॉर्म-क्रॉस से संबंधित है? या निम्न स्तर के प्रासंगिक।size_t uint32 uint64 आदि का उपयोग करने के लिए प्रेरणा

कभी-कभी, कोड मुझे समझ में आता है क्योंकि वे सिर्फ 32 बिट int या कुछ चाहते हैं। लेकिन, size_t क्या है? कृपया इसे स्पष्ट करने में मेरी सहायता करें।

उत्तर

15

ये मंच-आजादी के लिए हैं।

size_t परिभाषा के अनुसार, sizeof द्वारा लौटाया गया प्रकार है। यह लक्ष्य प्रणाली पर सबसे बड़ी वस्तु का प्रतिनिधित्व करने के लिए काफी बड़ा है।

इतने सालों पहले नहीं, किसी भी मंच के लिए 32 बिट पर्याप्त थे। आज 64 बिट्स पर्याप्त हैं। लेकिन कौन जानता है कि अब से 5, 10, या 50 साल की कितनी बिट्स की आवश्यकता होगी?

अपने कोड को ध्यान में रखते हुए लिखने के द्वारा - यानी, जब आप "ऑब्जेक्ट का आकार" का अर्थ रखते हैं तो हमेशा size_t का उपयोग करें - आप कोड लिख सकते हैं जो वास्तव में संकलित और 5, 10, या 50 साल से चलाएगा। या कम से कम एक लड़ने का मौका है।

कहने के लिए प्रकारों का उपयोग करें कि आपका क्या मतलब है। अगर किसी कारण से आपको बिट्स की एक विशिष्ट संख्या की आवश्यकता होती है (शायद केवल बाह्य परिभाषित प्रारूप से निपटने पर), आकार-विशिष्ट प्रकार का उपयोग करें। यदि आप कुछ ऐसा चाहते हैं जो "मशीन का प्राकृतिक शब्द आकार" है - यानी, तेजी से उपयोग करें int

यदि आप sizeof या strlen जैसे प्रोग्रामेटिक से निपट रहे हैं, तो size_t जैसे उस इंटरफ़ेस के लिए उपयुक्त डेटा प्रकार का उपयोग करें।

और कभी भी एक प्रकार को दूसरे को असाइन करने का प्रयास न करें जब तक कि परिभाषा के अनुसार मूल्य को पकड़ने के लिए पर्याप्त न हो।

+6

'आप कोड लिख सकते हैं जो वास्तव में ऑप्टिमाइज़्म के लिए +1 से 5, 10, या 50 साल संकलित करेगा :-) – Praetorian

+2

ठीक है, सी में नहीं, लेकिन मेरे पास कोड है जो 1 99 6 में लिखा गया था और अभी भी संकलित है और रन। पन्द्रह साल!

2

size_t पर जानकारी के लिए, स्टैक ओवरफ़्लो प्रश्न देखें: What is size_t in C?

आप सही uint32 और uint64 कि वे सिर्फ बिट्स है कि वे चाहते हैं की संख्या के बारे में विशेष जा रहा है कर रहे हैं के लिए कर रहे हैं, और कहा कि संकलक चाहिए उन्हें हस्ताक्षर के रूप में व्याख्या करें।

+1

कंपाइलर 'uint32_t' और 'uint64_t' को कई हस्ताक्षरित प्रकारों में से किसी एक के रूप में व्याख्या कर सकता है। उदाहरण के लिए, 'uint32_t' या तो हस्ताक्षरित int या हस्ताक्षरित लंबा हो सकता है (या यह अस्तित्व में नहीं हो सकता है अगर सिस्टम में कोई प्रकार नहीं है जो बिल्कुल 32 बिट्स है)। मुद्दा यह है कि आप * जानते हैं * uint32_t बिल्कुल 32 बिट्स है; आप सभी को 'हस्ताक्षरित int' के लिए सुनिश्चित किया जा सकता है कि यह कम से कम 16 बिट्स है। –

1

एक पूर्णांक मान के लिए अंतर्निहित प्रकार चुनने के कई संभावित कारण हैं। सबसे स्पष्ट एक अधिकतम संभव मूल्य का आकार है जिसे आप स्टोर कर सकते हैं - uint32 int32 जितनी बड़ी संख्या में स्टोर करने में सक्षम होगा, जो वांछनीय हो सकता है। int64 int32 से बहुत अधिक संख्या में स्टोर करने में सक्षम होगा - 2^31 - 1.

के बजाय 2^63 - 1 तक भी अन्य संभावित कारण भी हैं। यदि आप सीधे कुछ स्रोत (फ़ाइल, सॉकेट, आदि) से बाइनरी डेटा पढ़ रहे हैं, तो यह सुनिश्चित करना आवश्यक है कि इसका सही अर्थ हो। अगर कोई यूंट 32 लिखता है और आप इसे int32 के रूप में समझते हैं, तो यह संभव है कि आप एक बहुत बड़ी सकारात्मक संख्या को ऋणात्मक संख्या (अतिप्रवाह) के रूप में समझें।

size_t एक हस्ताक्षरित int के लिए केवल एक टाइपिफ़ है, आमतौर पर 32-बिट मुझे विश्वास है।

1

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

size_t का लाभ यह है कि यह हस्ताक्षरित है। एक ओर यह size_t का उपयोग करना अच्छा लगता है क्योंकि यह तर्क के बारे में अधिक जानकारी जोड़ता है (यानी नकारात्मक नहीं)। दूसरी तरफ यह कम टाइपिंग बनाम unsigned int है।

+1

फाइल होने पर विशिष्ट (uint64_t, int32_t, आदि) भी बहुत महत्वपूर्ण है, विशेष रूप से यदि फ़ाइल को अन्य प्लेटफॉर्म पर भी इस्तेमाल किया जाना है, या यदि इसे एक कदम से बचाना चाहिए, तो 32-बिट से 64-बिट मंच या लक्ष्य। –

3

प्रेरणा उन्हें इस्तेमाल करने के लिए है क्योंकि आप किसी विशेष आकार के लिए int, short या long पर भरोसा नहीं कर सकते हैं - एक गलती भी कई प्रोग्रामर अतीत में अभी तक भी कई बार द्वारा की गई। यदि आप इतिहास में बहुत दूर नहीं देखते हैं, तो 16 बिट से 32 बिट प्रोसेसर में एक संक्रमण हुआ, जिसने बहुत सारे कोड तोड़ दिए क्योंकि लोगों ने int पर 16 बिट्स पर गलत तरीके से भरोसा किया था। उसके बाद उसी गलती की गई जब लोग int पर 32 बिट्स पर निर्भर थे, और अभी भी इस दिन तक ऐसा करते हैं।

int, short और long शर्तों का उल्लेख नहीं किया गया है, वास्तव में भाषा डिजाइनरों द्वारा नियुक्त किया गया है, जो सभी उन्हें कुछ अलग करने का निर्णय लेते हैं। कुछ सी पढ़ने वाले जावा प्रोग्रामर ने 64 बिट्स का मतलब long की अपेक्षा की है। ये शब्द वास्तव में व्यर्थ हैं - वे किसी प्रकार के बारे में कुछ भी निर्दिष्ट नहीं करते हैं, और जब भी मैं एक नई भाषा जारी करता हूं, तब भी मुझे सामना करना पड़ता है जो अभी भी शर्तों का उपयोग करता है।

मानक int प्रकार एक आवश्यकता थी ताकि आप जिस प्रकार का उपयोग करना चाहते हैं उसका उपयोग कर सकें। उन्हें दशकों पहले int, short और long को बहिष्कृत करना चाहिए था।

+0

"जेनेरिक" प्रकार 'int', 'short' और' long', लेकिन' size_t', आदि भी अधिकांश कोड के लिए आईएमओ को प्राथमिकता दी जानी चाहिए, जहां प्रकार का सटीक आकार वास्तव में महत्वपूर्ण नहीं है। केवल तभी सही आकार मायने रखता है, "निश्चित आकार" प्रकार जैसे 'uint32_t' या' int64_t' का उपयोग किया जाना चाहिए। ध्यान दें कि वे प्रकार 'int',' long int', आदि के लिए मैप किए गए हैं जिनके कार्यान्वयन के लिए वह आकार है। –

+2

लेकिन आप 'int',' short' या 'long' का उपयोग करने के लिए चुनाव कैसे करते हैं? यदि आकार महत्वपूर्ण नहीं है, तो हमें एक ही चीज़ का उपयोग करने के लिए 3 अलग-अलग कीवर्ड की आवश्यकता क्यों है: एक पूर्णांक प्रकार जिसका आकार हम नहीं जानते हैं। –

+0

यदि आपको केवल एक छोटी संख्या की आवश्यकता है, तो 'लघु' का उपयोग करें। यदि आपको एक बड़ा की जरूरत है, तो 'लंबा' का उपयोग करें। ध्यान दें कि, "int32_t' का उपयोग करते हुए, 16-बिट प्लेटफॉर्म पर, अधिक कठिन और अक्षम (संभवतः दो रजिस्टरों की आवश्यकता होती है) का उपयोग करना होगा। इस तरह के एक मंच पर, 'int' शायद 16 बिट भी है, और अधिक कुशल है। –

संबंधित मुद्दे