我有两种从函数返回空字符串的方法。
1)
std::string get_string()
{
return "";
}
2)
std::string get_string()
{
return std::string();
}
哪一个更有效率,为什么?
答案 0 :(得分:32)
Gcc 7.1 -O3这些都是相同的,godbolt.org/z/a-hc1d - jterm 4月25日3:27
代码:
#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 {};
的工作量相对较少(这两个相同)。
正如Frerich Raabe所说,当传递空C_string
时,它仍然需要对其进行处理,而不是仅仅分配内存。似乎这不能被优化掉(至少不是GCC)
所以答案是肯定使用:
return std::string();
或
return {}; //(c++11)
虽然除非你在性能关键代码中返回很多空字符串(记录我猜?),但差别仍然是微不足道的。
答案 1 :(得分:3)
后一版本永远不会比第一版慢。第一个版本调用std::string
构造函数采用C字符串,然后必须首先计算字符串的长度。尽管对于一个空字符串来说速度很快,但它肯定不会比没有完成它更快。