2010-12-05 14 views
6

मुझे पता है कि सी/सी ++ में स्ट्रिंग अक्षर स्थिर भंडारण अवधि है, जिसका अर्थ है कि वे "हमेशा के लिए" रहते हैं, यानी जब तक कार्यक्रम चलता है।सी ++ स्ट्रिंग अक्षर बनाम कॉन्स स्ट्रिंग्स

इस प्रकार, अगर मैं एक समारोह है कि बहुत बार कहा जाता है की जा रही है और एक स्ट्रिंग तो जैसे शाब्दिक का उपयोग करता है:

void foo(int val) 
{ 
    std::stringstream s; 
    s << val; 
    lbl->set_label("Value: " + s.str()); 
} 

जहां set_label समारोह एक const std::string& एक पैरामीटर के रूप लेता है।

क्या मुझे स्ट्रिंग अक्षर के बजाय const std::string का उपयोग करना चाहिए या इससे कोई फर्क नहीं पड़ता?

मुझे जितना संभव हो उतना रनटाइम मेमोरी खपत कम करने की आवश्यकता है।

संपादित करें:

मैं स्ट्रिंग एक const std::string prefix("Value: "); कि एक स्थिरांक के कुछ प्रकार में आरंभ नहीं हो जाता फ़ाइल शीर्षक के साथ शाब्दिक तुलना करने के लिए मतलब है।

इसके अलावा, संयोजन यहां एक अस्थायी रिटर्न (हमें यह Value: 42 और यह अस्थायी समारोह set_text() के लिए पारित किया जा रहा है के लिए एक स्थिरांक संदर्भ कॉल? हूँ मैं इस में ठीक कर लें,

आप फिर से धन्यवाद!

+0

की जाँच अपने जादू 8 गेंद में क्या कहना है? –

+0

यदि आप रनटाइम मेमोरी खपत को कम करना चाहते हैं, तो कॉन्स्ट char * लेने के लिए set_label को संशोधित करने के बारे में और स्ट्रिंग के बजाय char * का उपयोग कैसे करें? – user347594

+0

@ user347594: मैं दुर्भाग्य से 'set_label' को संशोधित नहीं कर सकता –

उत्तर

9

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

+5

जब तक आप जानते हैं कि ओपी का उपयोग किस कार्यान्वयन में नहीं है, आप यह नहीं जान सकते कि यह वही नहीं है जो वैसे भी हो रहा है और न ही संकलक अनुकूलन आपके कथन को पूरी तरह से झूठा नहीं प्रस्तुत करेगा। –

+1

नूह सही है, इस तरह की एक छोटी सी स्ट्रिंग हीप स्टोरेज का उपयोग नहीं कर सकती है। दूसरी तरफ 'स्ट्रिंगस्ट्रीम' बहुत हेवीवेट है ... –

+0

@ नोहा: मुझे पूरा यकीन है कि कंपाइलर कैसे अनुकूलित करता है, यह एक शाब्दिक स्ट्रिंग की तुलना में कुछ अधिक कुशल नहीं हो सकता है। – Puppy

0

आप अपना कॉन्स std :: स्ट्रिंग कैसे बनाएंगे? यदि y कहां इसे कुछ स्ट्रिंग लिबरल से करें, अंत में यह खराब (या यदि कंपेलर अच्छा काम करता है तो समान होगा)। एक स्ट्रिंग अक्षर बहुत मेमोरी का उपभोग नहीं करता है, और स्थिर स्मृति भी हो सकता है, जो कि आपकी स्मृति की तरह नहीं हो सकती है।

यदि आप अपनी सभी स्ट्रिंग अक्षरों को पढ़ सकते हैं, तो एक फ़ाइल कहें, और जब स्ट्रिंग का उपयोग नहीं किया जाता है तो स्मृति को ओएस पर वापस दे दें, स्मृति पदचिह्न को कम करने के कुछ तरीके हो सकते हैं (लेकिन यह शायद धीमा हो जाएगा कार्यक्रम बहुत)।

लेकिन इस तरह की चीज करने से पहले मेमोरी खपत को कम करने के कई अन्य तरीके हैं।

0

उन्हें किसी प्रकार के संसाधन में स्टोर करें और उन्हें आवश्यकतानुसार लोड/अनलोड करें।

2

यह कम स्मृति का उपयोग करेगा और बहुत तेजी से (snprintf का उपयोग अपने संकलक यह समर्थन करता है) चलाएँ:

void foo(int val) 
{ 
    char msg[32]; 
    lbl->set_label(std::string(msg, sprintf(msg, "Value: %d", val))); 
} 

भी तेजी से कार्यान्वयन के लिए, C++ performance challenge: integer to std::string conversion

+0

+1! हालांकि, मेरे मूल प्रश्न पर वापस आ रहा है, क्या एक स्ट्रिंग अक्षर एक स्थिरांक हेडर फ़ाइल में परिभाषित 'const std :: string' का उपयोग करने से अधिक प्रासंगिक होगा? –

+0

@vic: यह वास्तव में निर्भर करता है कि आपको लंबाई की आवश्यकता है या नहीं। 'std :: string' लंबाई को कैश करता है, इसलिए यह एक चर पढ़ने के लिए एक छोटा सा मामला है, जबकि 'char *' के साथ आपको 'strlen' का उपयोग करना होगा जो पुनरावृत्त करता है। हालांकि, स्ट्रिंग शाब्दिक ही एक वर्ण सरणी है जो संकलन-समय प्रकार की जानकारी के हिस्से के रूप में इसकी लंबाई लेती है, जो सभी का सबसे तेज़ है (जब कोड इसका लाभ लेने के लिए लिखा जाता है)। –

+0

आप अपने उत्तर में एक कोष्ठक चूक गए। वैसे भी +1। मुझे समाधान पसंद है। – whoan

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