Abh*_*del 20 c++ string performance
我有两种从函数返回空字符串的方法.
1)
std::string get_string()
{
return "";
}
Run Code Online (Sandbox Code Playgroud)
2)
std::string get_string()
{
return std::string();
}
Run Code Online (Sandbox Code Playgroud)
哪一个更有效率,为什么?
Bal*_*ckk 38
做了一些挖掘.下面是一个示例程序和相关程序集:
码:
#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();
}
Run Code Online (Sandbox Code Playgroud)
部件:
__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
Run Code Online (Sandbox Code Playgroud)
这是编译的-std=c++11 -O2.
你可以看到,对于相当多的更多的工作return "";说明和相当小的return std::string和return {};(这两个是相同的).
正如Frerich Raabe所说,当传递一个空的时候C_string,它仍然需要对它进行处理,而不是仅仅分配内存.似乎无法优化(至少不是GCC)
所以答案是肯定使用:
return std::string();
Run Code Online (Sandbox Code Playgroud)
要么
return {}; //(c++11)
Run Code Online (Sandbox Code Playgroud)
虽然除非你在性能关键代码中返回很多空字符串(我猜是记录?),但差别仍然是微不足道的.
| 归档时间: |
|
| 查看次数: |
19750 次 |
| 最近记录: |