2014-11-04 10 views
6

मैं ऐसे सरल कोड का प्रयास करें:क्यों कंपाइलर std :: स्ट्रिंग concat अनुकूलित नहीं कर सकता है?

int main() 
{ 
    puts("ab"); 
    return 0; 
} 

लिए इस तरह के कोड का अनुकूलन

#include <cstdio> 
#include <string> 

int main() 
{ 
    const std::string s = std::string("a") + "b"; 
    puts(s.c_str()); 
    return 0; 
} 

मुझे लगता है कि संकलक उम्मीद (जीसीसी 4.8.2/बजना 3.5.0) लेकिन मैं इस तरह के परिणाम नहीं मिल सकता है, मैं की तरह "-Ofast", "-flto", "स्थैतिक-libstdC++" विभिन्न विकल्पों की कोशिश, लेकिन हमेशा disassembler उत्पादन में देखते हैं तीन कार्यों फोन:

... 
callq 0x4017e0 <_ZNSsC2EPKcRKSaIcE> 
... 
callq 0x401690 <_ZNSs6appendEPKc> 
... 
callq 0x401490 <_ZNSs4_Rep10_M_disposeERKSaIcE> 

पहले एक एसटीडी कॉल :: basic_string है, std :: आवंटक> :: basic_string (char const *, std :: allocator const &)।

तो कोई भी कंपाइलर है, जो इस तरह के कोड को केवल "(ab") रखने के लिए ऑप्टमाइज़ कर सकता है; या कम से कम "std :: string s (" ab ");"?

और यदि ऐसा कोई कंपाइलर नहीं है, तो इस तरह के अनुकूलन को कार्यान्वित करने में क्या मुश्किल है?

अद्यतन असली दुनिया के उपयोग के बारे में। मैं देख रहा हूँ/इस तरह के पैटर्न के साथ वास्तविक कोड में कई स्थानों पर देखा:

std::string s = std::string(string_const1) + string_const2 + string_variable + string_const3; 

और अगर प्रदर्शन महत्वपूर्ण है, निश्चित रूप से इसे और अधिक इष्टतम तरीकों से इस तरह के कोड को फिर से लिखने के लिए संभव है।

लेकिन आधुनिक कंपाइलर कोड अनुकूलित करने के लिए बड़ी नौकरियां करते हैं। और जीसीसी, उदाहरण के लिए malloc/free/strcpy/strcat के लिए __builtin फ़ंक्शन हैं और इसी तरह। और यदि gcc से libstdC++ से std :: basic_string कार्यान्वयन के हिस्से के लिए उन्हें इन फ़ंक्शंस (मॉलोक, फ्री, स्ट्रैपी, स्ट्रैट) का उपयोग करें, तो फ़ंक्शन उपयोग के परिणाम की भविष्यवाणी क्यों न करें और उत्तर दें।

+0

क्योंकि सी ++ वर्ग कन्स्ट्रक्टर और ऑपरेटर फ़ंक्शन हैं, वे बीजगणितीय नहीं हैं, इस प्रकार बीजगणितीय अनुकूलन का पता लगाना मुश्किल है। – didierc

+1

आपने यह नहीं कहा कि आप ऐसा क्यों करना चाहते हैं, लेकिन 'std :: string s = "a" "b" होगा;' अपनी जरूरतों के अनुरूप? एक दूसरे के बगल में लिखा जब स्ट्रिंग अक्षर ऑटो पेस्ट। –

+0

स्पष्ट होने के लिए, सी ++ मानक प्रोग्राम को 'puts ("ab"); या समकक्ष के लिए अनुकूलित करने की अनुमति देता है। लेकिन कंपाइलर्स ऐसा नहीं करते हैं। मुझे लगता है कि आपको एक कंपाइलर डेवलपर से पूछना होगा, लेकिन शायद इसका हिस्सा प्रोग्रामर की इच्छाओं के सम्मान में करना होगा। यदि वे अंततः * as-if * नियम का पालन करते हैं तो बहुत सारी शिकायतें होंगी; जैसे स्क्रीन पर कुछ लिखने के लिए सिस्टम कॉल करना, या नींद करना, सी ++ 14 में परिभाषा के अनुसार कोई अवलोकन योग्य व्यवहार नहीं है। –

उत्तर

7

std::string में भंडारण के गतिशील आवंटन शामिल हैं और, ज्यादातर मामलों में, एक बेहद जटिल कार्यान्वयन और इसलिए संकलन-समय अर्थशास्त्र में कम नहीं किया जा सकता है, इससे कोई फर्क नहीं पड़ता कि संकलक एक अच्छी कला में कितनी अच्छी तरह से तब्दील हो रहा है।

हालांकि: यदि आपका string वास्तव में इस तरह घोषित किया गया है तो आपने पहले स्थान पर char सरणी का उपयोग क्यों नहीं किया, लेकिन string चुना? यदि आपको दूसरों के उत्पादन के लिए कुछ तारों के साथ काम करने की ज़रूरत है, तो अभी भी ऐसे उपकरण हैं जो char सरणी के साथ उस नौकरी को कर सकते हैं, खासकर जब से सी ++ 11 ने वैरैडिक टेम्पलेट्स और constexpr पेश किए। सी ++ का एक भविष्य संस्करण उम्मीद है कि इसे और आसानी से std::string_literal भी पेश करेगा।

+0

क्या C++ 14 सुविधाओं का उपयोग एक constexpr std :: string :: ऑपरेटर + और ओपी के अनुरोध को लागू करना संभव होगा? – liori

+0

@liori मुझे ऐसा सोचना चाहिए क्योंकि 'string_literal' C++ 14 पर आधारित है। – Columbo

+1

यह भी जटिल समस्या है कि जीसीसी की 'std :: string' अभी भी प्रतिलिपि पर है। –

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