2009-05-22 9 views
6

सी #: जो अधिक मेमोरी ओवरहेड का उपयोग करता है? एक स्ट्रिंग या चार शब्द का अनुक्रम धारण करता है?सी #: जो अधिक मेमोरी ओवरहेड का उपयोग करता है? एक स्ट्रिंग या चार शब्द का अनुक्रम धारण करता है?

मुझे पता है कि एक char मूल रूप से एक शब्द (यदि एक से अधिक चार) बनाने के लिए प्रत्येक char की एक सरणी है, लेकिन आखिरकार आपको अधिक मेमोरी ओवरहेड का कारण बनता है जैसे एक स्ट्रिंग बनाम एक चार्ज का उपयोग करते हुए कुछ एक शब्द की लंबाई?

+3

यह होमवर्क प्रश्न की तरह लगता है लेकिन अगर यह नहीं है ... यदि आपको स्मृति को बचाने के लिए स्ट्रिंग या char [] के बीच चयन करना है, तो शायद आपको सी # में प्रोग्रामिंग नहीं करना चाहिए। मैं यह इसलिए कहता हूं क्योंकि इस्तेमाल की गई स्मृति की मात्रा कम या ज्यादा धोती है क्योंकि स्ट्रिंग में संग्रहीत एक वर्ण एक चरित्र में एक चरित्र स्टोर के समान आकार होता है। – Tony

+1

यह क्यों मायने रखता है? जब तक कि आपके पास दस लाख शब्द नहीं हैं, यह वास्तव में कोई फर्क नहीं पड़ता ... –

उत्तर

7

यह इस बात पर निर्भर करेगा कि आपने कितनी बार सवाल उठाया था। जिस तरह से नेट स्ट्रिंग्स यह है कि यदि आपके पास एक ही मान के साथ कई स्ट्रिंग होते हैं तो वह मान केवल स्मृति में संग्रहीत होता है और प्रत्येक स्ट्रिंग वेरिएबल पॉइंट उस मान पर संग्रहीत होता है। हालांकि, प्रत्येक सर सरणी का उपयोग अपनी मेमोरी आवंटन होगा, भले ही चार सरणी की सामग्री समान हों।

जैसे

//.Net Framework allocates memory space for "word" only once, all the three variables refer to this chunk of memory 
String s1, s2, s3; 
s1 = "word"; 
s2 = "word"; 
s3 = "word"; 

//.Net Framework allocates memory for each array 
char[] c1 = new char[] { 'w','o','r','d'}; 
char[] c2 = new char[] { 'w','o','r','d'}; 
char[] c3 = new char[] { 'w','o','r','d'}; 
+0

हमम। और क्या होगा अगर मैं s1 = "word2" बदलूं? क्या यह इसके लिए अलग मेमोरी स्पेस आवंटित करेगा? और एस 2 और एस 3 अभी भी वही जगह साझा करेंगे, है ना? – Kirtan

+12

"समान तार" (उर्फ "इंटर्निंग") के बारे में टिप्पणी केवल आपके स्रोत कोड से तारों पर लागू होती है (जब तक कि आप जानबूझकर अनुरोध नहीं करते)। तो यह केवल स्रोत कोड ** से "शब्द" ** के लिए एक स्ट्रिंग उदाहरण का उपयोग करेगा, और स्रोत कोड ** से "word2" ** के लिए एक होगा। लेकिन: यदि आप स्ट्रिंग "word2" * स्रोत * (concatenation, या उपयोगकर्ता इनपुट, आदि से नहीं) स्ट्रिंग बनाते हैं, तो उसके पास * * अलग * उदाहरण होगा - भले ही आप इसे 200 बार (200 उदाहरणों के साथ) करते हैं। –

0

आम तौर पर स्ट्रिंग के रूप में RobV एक ही मूल्य के साथ कई तार बताया और अधिक कुशल होने जा रहा है सभी संदर्भ में एक ही स्ट्रिंग स्मृति में इस string interning कहा जाता है। स्ट्रिंग की तुलना करते समय इसका बड़ा बोनस हो सकता है।

यदि स्मृति एक बड़ी चिंता है तो शायद आप सावधान रहना चाहते हैं कि आप तारों से कैसे निपटते हैं, concatenation बहुत महंगा हो सकता है।

+0

केवल शाब्दिक तारों को डिफ़ॉल्ट रूप से प्रशिक्षित किया जाता है। –

2

यदि आप string और char[] की मेमोरी स्टोरेज की तुलना करते हैं, तो वे काफी समान हैं। वे दोनों ढेर पर आवंटित होते हैं (शाब्दिक तारों को छोड़कर जो संकलन समय पर बनाए जाते हैं)। दोनों में कुछ चर होते हैं (लंबाई और इस तरह के लिए), और स्मृति क्षेत्र जिसमें वर्णों की एक सरणी होती है।

हालांकि, string कैसे बनाया गया है, इस पर निर्भर करता है कि यह स्मृति क्षेत्र इसकी लंबाई की तुलना में बड़ा हो सकता है, यानी स्मृति क्षेत्र के अंत में इसमें कुछ अप्रयुक्त बाइट हैं। char[] का मेमोरी एरिया हमेशा डेटा द्वारा आवश्यक जितना बड़ा होता है।

आप उदाहरण के लिए एक StringBuilder का उपयोग एक स्ट्रिंग बनाने के लिए, और क्षमता यह की दूरी (लेकिन दो बार से अधिक) से भी बड़ा है, तो यह एक string वस्तु जो अंत में अप्रयुक्त बाइट का है देता है।

उदाहरण:

// set capacity to 8 
StringBuilder s = new StringBuilder(8); 
// put four characters in it 
s.Append("Ouch"); 
// get the string 
string result = s.ToString(); 

result चर अब, एक स्ट्रिंग वस्तु जो चरित्र डेटा कि 16 बाइट्स लंबा है के लिए एक स्मृति क्षेत्र है के लिए अंक, लेकिन केवल पहले 10 उपयोग किया जाता है (चार अक्षर के साथ साथ अंत में एक \x0 चरित्र)।

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