कुछ खुदाई हुई।
कोड::
#include <string>
std::string get_string1(){ return ""; }
std::string get_string2(){ return std::string(); }
std::string get_string3(){ return {}; } //thanks Kerrek SB
int main()
{
get_string1();
get_string2();
get_string3();
}
विधानसभा:
__Z11get_string1v:
LFB737:
.cfi_startproc
pushl %ebx
.cfi_def_cfa_offset 8
.cfi_offset 3, -8
subl $40, %esp
.cfi_def_cfa_offset 48
movl 48(%esp), %ebx
leal 31(%esp), %eax
movl %eax, 8(%esp)
movl $LC0, 4(%esp)
movl %ebx, (%esp)
call __ZNSsC1EPKcRKSaIcE
addl $40, %esp
.cfi_def_cfa_offset 8
movl %ebx, %eax
popl %ebx
.cfi_restore 3
.cfi_def_cfa_offset 4
ret $4
.cfi_endproc
__Z11get_string2v:
LFB738:
.cfi_startproc
movl 4(%esp), %eax
movl $__ZNSs4_Rep20_S_empty_rep_storageE+12, (%eax)
ret $4
.cfi_endproc
__Z11get_string3v:
LFB739:
.cfi_startproc
movl 4(%esp), %eax
movl $__ZNSs4_Rep20_S_empty_rep_storageE+12, (%eax)
ret $4
.cfi_endproc
यह -std=c++11 -O2
साथ संकलित किया गया था नीचे एक उदाहरण कार्यक्रम और प्रासंगिक विधानसभा है।
आप देख सकते हैं कि return "";
कथन के लिए बहुत अधिक काम है और return std::string
और return {};
के लिए तुलनात्मक रूप से बहुत कम है (ये दोनों समान हैं)।
जैसे फ्रैरिक राबे ने कहा, खाली C_string
खाली करते समय, इसे अभी भी स्मृति आवंटित करने के बजाय, इस पर प्रसंस्करण करने की आवश्यकता है।
return std::string();
या
return {}; //(c++11)
हालांकि जब तक आप लौट रहे हैं: यह है कि इस दूर अनुकूलित नहीं किया जा सकता (कम से कम जीसीसी द्वारा नहीं)
तो जवाब निश्चित रूप से उपयोग करने के लिए है लगता है प्रदर्शन महत्वपूर्ण कोड (लॉगिंग मुझे लगता है?) में खाली तारों के बहुत सारे, अंतर अभी भी महत्वहीन नहीं होगा।
न तो। 'वापसी {};' का प्रयोग करें। –
और यह सी से कैसे संबंधित है? – crashmstr
यह बेकार माइक्रो-ऑप्टिमाइज़ेशन के दायरे में पड़ता है कि आपका कंपाइलर आरवीओ का उपयोग करके ऑप्टिमाइज़ करेगा और एलिशन कॉपी करेगा। – CoryKramer