gpt4 book ai didi

c++ - 返回一个空字符串 : efficient way in c++

转载 作者:IT老高 更新时间:2023-10-28 22:08:31 25 4
gpt4 key购买 nike

我有两种从函数返回空字符串的方法。

1)

std::string get_string()
{
return "";
}

2)

std::string get_string()
{
return std::string();
}

哪一个更有效,为什么?

最佳答案

Gcc 7.1 -O3 these are all identical, godbolt.org/z/a-hc1d – jterm Apr 25 at 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::stringreturn { };(这两个是相同的)。

正如 Frerich Raabe 所说,当传递一个空的 C_string 时,它仍然需要对其进行处理,而不仅仅是分配内存。看来这不能被优化掉(至少不是通过 GCC)

所以答案肯定是使用:

return std::string();

return {};   //(c++11)

尽管除非您在性能关键代码中返回 很多 空字符串(我猜是日志记录?),但差异仍然是微不足道的。

关于c++ - 返回一个空字符串 : efficient way in c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26587110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com