2011-06-04 20 views
18

में std :: स्ट्रिंग की स्ट्रिंग का आकार प्राप्त करें मैं बाइट्स को std::string की स्ट्रिंग मेमोरी में कब्जा कर लेना चाहता हूं, वर्णों की संख्या नहीं। स्ट्रिंग में एक मल्टीबाइट स्ट्रिंग होती है। std::string::size() मेरे लिए यह करेगा?बाइट्स

संपादित करें: size() में NULL समाप्ति भी शामिल है?

उत्तर

21

std::string, बाइट्स पर चल रही है यूनिकोड वर्ण पर नहीं है, इसलिए std::string::size() वास्तव में बाइट्स में डेटा का आकार वापस आ जाएगी (भूमि के ऊपर के बिना कि std::string जरूरतों ज़ाहिर है, डाटा स्टोर करने की)।

नहीं, std::string केवल उस डेटा को स्टोर करता है जिसे आप स्टोर करने के लिए कहते हैं (इसे पिछला NULL वर्ण की आवश्यकता नहीं है)। इसलिए इसे आकार में शामिल नहीं किया जाएगा, जब तक कि आप एक पीछे NULL वर्ण के साथ स्ट्रिंग बनाते हैं।

+0

क्या यह कहना वैध है कि std :: string char array के समान है? या क्या कोई बड़ा अंतर है? – rzetterberg

+2

हां, चार सरणी बिल्कुल 'std :: string' है। 'Std :: string' और' std :: vector 'के बीच कुछ कार्यान्वयन अंतर हैं, लेकिन वे जो डेटा संग्रहीत कर रहे हैं वह वही है। –

+7

बस यह इंगित करना चाहते हैं कि 'std :: string :: size()' में 'NULL' वर्ण शामिल नहीं है, 'स्ट्रेल' द्वारा निर्धारित सम्मेलन का पालन करना है जिसमें इसे शामिल नहीं किया गया है। 'Std :: string' के वास्तविक कार्यान्वयन के लिए' स्ट्रिंग :: c_str() 'विधि को न्यूनतम ओवरहेड के साथ लागू करने के लिए' NULL' को समाप्त करने के लिए * संग्रहण * की आवश्यकता होती है। शायद [यह सवाल] (http://stackoverflow.com/q/4653745) मुझसे बेहतर बताता है। – rwong

2

हां, आकार() आपको स्ट्रिंग में char की संख्या देगा। मल्टीबाइट एन्कोडिंग में एक वर्ण कई char लेता है।

5

std::string::size() वास्तव में बाइट्स में आकार है।

4

स्ट्रिंग द्वारा उपयोग में स्मृति की मात्रा प्राप्त करने के लिए आपको capacity() को प्रबंधन के लिए उपयोग किए गए ओवरहेड के साथ जोड़ना होगा। ध्यान दें कि यह capacity() है और size() नहीं है। क्षमता आवंटित वर्णों की संख्या निर्धारित करती है (charT) आवंटित, जबकि size() आपको बताती है कि उनमें से कितने वास्तव में उपयोग में हैं।

विशेष रूप से, std::string कार्यान्वयन आमतौर पर * shrink_to_fit * सामग्री, इसलिए यदि आप एक स्ट्रिंग बनाने और उसके बाद अंत से तत्वों को हटाने, size() कम कर नहीं किया जाएगा, लेकिन ज्यादातर मामलों में (इस कार्यान्वयन परिभाषित किया गया है) capacity() नहीं होगा।

कुछ कार्यान्वयन आवश्यक स्मृति की सटीक मात्रा आवंटित नहीं कर सकते हैं, बल्कि मेमोरी विखंडन को कम करने के लिए दिए गए आकारों के ब्लॉक प्राप्त कर सकते हैं। एक कार्यान्वयन में तारों के लिए दो आकार के ब्लॉक की शक्ति का उपयोग किया गया, आकार 17 के साथ एक स्ट्रिंग 32 वर्णों को आवंटित किया जा सकता है।

6

आप इसके बारे में पंडिताऊ हो सकता है:

std::string x("X"); 

std::cout << x.size() * sizeof(std::string::value_type); 

लेकिन std :: स्ट्रिंग :: VALUE_TYPE चार और sizeof (चार) के रूप में परिभाषित किया गया है 1.

यह केवल typedef अगर आप महत्वपूर्ण हो जाता है स्ट्रिंग प्रकार (क्योंकि यह भविष्य में या कंपाइलर विकल्पों के कारण बदल सकता है)।

// Some header file: 
typedef std::basic_string<T_CHAR> T_string; 

// Source a million miles away 
T_string x("X"); 

std::cout << x.size() * sizeof(T_string::value_type); 
संबंधित मुद्दे