2010-06-06 13 views
5

संभव डुप्लिकेट:
When to use std::size_t?क्या यह जगह पर std :: size_t का उपयोग करने के लिए अच्छा अभ्यास है?

मैं अपने कोड में स्थिरांक कि अहस्ताक्षरित नंबर दिए गए हैं, जैसे की एक बहुत कुछ है काउंटर, आवृत्ति कटऑफ, लंबाई, आदि। मैंने या unsigned int के बजाय इन सभी के लिए std::size_t का उपयोग शुरू किया।

क्या यह सही काम है? मैंने इसे शुरू किया क्योंकि एसटीएल कंटेनर इसे अपने आकार के लिए उपयोग करते हैं, इसका उपयोग स्ट्रिंग स्थिति आदि के लिए किया जाता है।

+0

यह वास्तव में प्रतीत होता है, क्यों न केवल int के साथ जाते हैं? –

+2

प्रभावी डुप्लिकेट [std :: size_t का उपयोग कब करें?] (Http://stackoverflow.com/questions/1951519/when-to-use-stdsize-t) –

+0

देखें: http://stackoverflow.com/questions/ 1951519/जब से उपयोग-stdsize-टी –

उत्तर

8

std::size_t मेमोरी स्थानों की गणना करने के लिए उपयोग करने के लिए प्रकार है, जैसे सरणी लंबाई, ऑब्जेक्ट्स का आकार इत्यादि। एसटीएल कंटेनर हैं container_type::size_type का उपयोग करके, आमतौर पर नक्शा std::size_t पर होगा, लेकिन ऐसा करने की गारंटी नहीं है।

आप गैर नकारात्मक अभिन्न आयोजित करने के लिए प्रकार जो कि ऊपर उल्लेख किया उद्देश्यों के लिए इस्तेमाल नहीं कर रहे हैं की जरूरत है, क्या साथ unsigned short, unsigned int, और unsigned long गलत क्या है?

2

आप चर के लिए size_t का उपयोग कर सकते हैं जो स्मृति में संग्रहीत वस्तुओं के आकार का प्रतिनिधित्व करते हैं। लेकिन किसी और चीज के लिए इसका इस्तेमाल करने का कोई कारण नहीं है। यह मुख्य रूप से मौजूद है क्योंकि बिना किसी ज्ञात int मेमोरी ऑब्जेक्ट के आकार का प्रतिनिधित्व करने के लिए पर्याप्त रूप से विस्तृत नहीं हो सकता है। (16-बिट इंट्स के साथ एक आर्किटेक्चर पर विचार करें, लेकिन 32-बिट एड्रेस स्पेस।)

3

size_t वास्तव में stddef.h में परिभाषित एक टाइपिफ़ाफ़ है और यह प्लेटफार्म निर्भर है, इसलिए आप वास्तव में इसके बारे में कोई अनुमान नहीं बना सकते हैं। जीसीसी 4.4 (i486) पर इसे लंबे समय तक हस्ताक्षरित int के रूप में परिभाषित किया जाता है, जब तक कि ओएस पहले से ही इसे परिभाषित नहीं करता है, इसलिए उदाहरण के लिए i386 मशीन पर नि: शुल्क बीएसडी 5 पर यह एक आईआई 64 मशीन पर बिना हस्ताक्षर किए जाने वाले इंटिन होने वाला है, यह एक हस्ताक्षरित लंबा होगा। तो उदाहरण के लिए आप की तरह

size_t i; 
... 
char buf[4]; 
sprintf(buf,"%u",i); 

कुछ करने के लिए कोशिश करता है, तो कभी कभी यह वाला रन है, लेकिन कुछ प्लेटफार्मों पर/compilers आप कर रहे हैं वाला एक बफर अतिप्रवाह मिलता है।

मेरा मुद्दा यह है कि यदि आप आकार/आकार के आकार/प्रकार के बारे में धारणाएं करना चाहते हैं तो इससे कुछ बुरा पोर्टेबिलिटी समस्याएं हो सकती हैं।

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

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