मैं ऐसे सरल कोड का प्रयास करें:क्यों कंपाइलर 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 कार्यान्वयन के हिस्से के लिए उन्हें इन फ़ंक्शंस (मॉलोक, फ्री, स्ट्रैपी, स्ट्रैट) का उपयोग करें, तो फ़ंक्शन उपयोग के परिणाम की भविष्यवाणी क्यों न करें और उत्तर दें।
क्योंकि सी ++ वर्ग कन्स्ट्रक्टर और ऑपरेटर फ़ंक्शन हैं, वे बीजगणितीय नहीं हैं, इस प्रकार बीजगणितीय अनुकूलन का पता लगाना मुश्किल है। – didierc
आपने यह नहीं कहा कि आप ऐसा क्यों करना चाहते हैं, लेकिन 'std :: string s = "a" "b" होगा;' अपनी जरूरतों के अनुरूप? एक दूसरे के बगल में लिखा जब स्ट्रिंग अक्षर ऑटो पेस्ट। –
स्पष्ट होने के लिए, सी ++ मानक प्रोग्राम को 'puts ("ab"); या समकक्ष के लिए अनुकूलित करने की अनुमति देता है। लेकिन कंपाइलर्स ऐसा नहीं करते हैं। मुझे लगता है कि आपको एक कंपाइलर डेवलपर से पूछना होगा, लेकिन शायद इसका हिस्सा प्रोग्रामर की इच्छाओं के सम्मान में करना होगा। यदि वे अंततः * as-if * नियम का पालन करते हैं तो बहुत सारी शिकायतें होंगी; जैसे स्क्रीन पर कुछ लिखने के लिए सिस्टम कॉल करना, या नींद करना, सी ++ 14 में परिभाषा के अनुसार कोई अवलोकन योग्य व्यवहार नहीं है। –