2009-07-25 18 views

उत्तर

77

एक छोटी संख्या भी है। एक हस्ताक्षर किए गए चार के रूप में।

लेकिन उन प्रकार से कोई भी इतना बड़ा किसी भी तार के आकार का प्रतिनिधित्व करने के होने की गारंटी कर रहे हैं।

string::size_type बस इसकी गारंटी देता है। यह एक प्रकार है जो एक स्ट्रिंग के आकार का प्रतिनिधित्व करने के लिए काफी बड़ा है, इससे कोई फर्क नहीं पड़ता कि स्ट्रिंग कितनी बड़ी है।

यह आवश्यक उदाहरण के लिए 64-बिट प्लेटफ़ॉर्म पर विचार करें। एक इंट आमतौर पर उन पर 32 बिट है, लेकिन आपके पास 2^32 बाइट्स मेमोरी है।

तो यदि एक (हस्ताक्षरित) int का उपयोग किया गया था, तो आप 2^31 वर्णों से बड़े स्ट्रिंग बनाने में असमर्थ होंगे। आकार_टाइप उन प्लेटफार्मों पर 64-बिट मान होगा, इसलिए यह बिना किसी समस्या के बड़े स्ट्रिंग का प्रतिनिधित्व कर सकता है।

+1

यह पावरपीसी और सेल पर भी मामला है। और, जहां तक ​​मैं अल्फा पर भी याद कर सकता हूं। इसके अलावा, मुझे लगता है कि x64 इन दिनों * सामान्य * 64-बिट CPU है। ;) लेकिन आप सही हैं, यह स्पष्ट रूप से मंच-निर्भर है। – jalf

+3

हम किस 64-बिट लिनक्स मंच के बारे में बात कर रहे हैं? X64 मशीनों पर, मैंने अभी भी 32-बिट इंच की कोशिश की थी। और सेल प्रोसेसर पर एक int भी 32 बिट्स है। और विस्तार से, मैं पावरपीसी पर लिनक्स पर आवेदन करने के लिए वही मान रहा हूं।तो नहीं, लिनक्स एबीआई प्लेटफ़ॉर्म से प्लेटफ़ॉर्म तक भिन्न होता है, और अधिकांश प्लेटफार्म जिन्हें मैं लिनक्स पर भी 4-बिट इन्स निर्दिष्ट करता हूं। – jalf

+1

लेकिन आप सही हैं। हार्डवेयर आमतौर पर एक आम एबीआई को परिभाषित करता है कि इंटरऑपरेबिलिटी की अनुमति देने के लिए सॉफ़्टवेयर * का पालन करना चाहिए। ओएस एक एबीआई को परिभाषित करता है जो आम तौर पर समान होता है, लेकिन हो सकता है। और संकलक वास्तव में एक एबीआई लागू करता है जो आमतौर पर ओएस का पालन करता है, लेकिन सख्ती से बोलना नहीं है। – jalf

7

एक नेस्टेड size_type टाइपपीफ एसटीएल-संगत कंटेनर (जो std::string होता है) के लिए एक आवश्यकता है, इसलिए जेनेरिक कोड आकार का प्रतिनिधित्व करने के लिए सही पूर्णांक प्रकार का चयन कर सकता है।

आवेदन कोड में इसका उपयोग करने का कोई मतलब नहीं है, एक size_t पूरी तरह से ठीक है (क्योंकि यह हस्ताक्षर करना चाहता है int, नहीं है, और आप पर हस्ताक्षर किए प्राप्त करेंगे/अहस्ताक्षरित तुलना चेतावनी)।

+2

क्या कोई कह सकता है कि कोई बात नहीं है? शायद अगर आप सबसे पोर्टेबल कोड नहीं चाहते थे तो 'size_t' का उपयोग करना ठीक होगा। या आज सबसे व्यावहारिक परिस्थितियों के लिए आप 'size_t' से दूर हो सकते हैं। लेकिन अगर इसका कोई मतलब नहीं था, तो 'size_type' मौजूद नहीं होगा, अब यह होगा? –

+1

'size_t' * * पर्याप्त होने की गारंटी है, इसलिए अधिक से अधिक आप एक आवश्यक मूल्य का उपयोग करने के लिए कुछ जगह (रजिस्टर या स्टैक पर)" बर्बाद "करते हैं। ये typedefs जेनेरिक कोड में उपयोग के लिए हैं, न कि 'std :: string' का उपयोग करते समय, जो एक ठोस मॉडल है। यही है, अगर आप एक टेम्पलेट फ़ंक्शन में मनमाने ढंग से 'basic_string', esp ले रहे हैं। एक मनमानी * आवंटक * के साथ, आपको नेस्टेड टाइपपीफ का उपयोग करना चाहिए। लेकिन हाँ, 'std :: string' के लिए कोई बात नहीं है, क्योंकि 'size_t' बिल्कुल ठीक है। –

+0

'size_t' हस्ताक्षरित है। जब तक आप 'std :: string :: npos' (' pos> = 0' के विपरीत) के साथ तुलना करते हैं, तो आपको ठीक होना चाहिए। – Jason

19

उदाहरण है कि आपके द्वारा दिए गए,

const std::string::size_type cols = greeting.size() + pad * 2 + 2; 

Accelerated C++ by Koenig से है। उन्होंने यह भी सही इस के बाद अपनी पसंद के लिए कारण कहा गया है, अर्थात्:

std :: स्ट्रिंग प्रकार size_type को परिभाषित करता है एक स्ट्रिंग में वर्णों की संख्या के आयोजन के लिए उचित प्रकार का नाम हो। जब भी हमें स्ट्रिंग के आकार को रखने के लिए स्थानीय चर की आवश्यकता होती है, तो हमें उस चर के प्रकार के रूप में std :: string :: size_type का उपयोग करना चाहिए।

कारण है कि हम कॉलम std :: तार का एक प्रकार दे दिया है :: size_type यह सुनिश्चित करें कि कॉलम चाहे कितना बड़ा है कि संख्या में हो सकता है पात्रों ग्रीटिंग में , की संख्या से युक्त करने में सक्षम है है। हम बस कह सकते हैं कि कोल्स के प्रकार int है, और वास्तव में, ऐसा करने से शायद काम होगा। हालांकि, कोल्स का मूल्य इनपुट के आकार पर हमारे कार्यक्रम पर निर्भर करता है, और हमारे पास इस पर कोई नियंत्रण नहीं है कि इनपुट कितना समय हो सकता है। यह कल्पना की जा सकती है कि कोई भी हमारे प्रोग्राम को इतनी लंबी स्ट्रिंग दे सकता है कि एक int इसकी लंबाई रखने के लिए अपर्याप्त है।

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