返回空字符串:c++中的有效方法

Returning an empty string : efficient way in c++

本文关键字:有效 方法 c++ 字符串 返回      更新时间:2023-10-16

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

1)

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

2)

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

哪一个更有效,为什么?

Gcc 7.1-O3这些都是相同的,godbolt.org/z/a-hc1d–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::stringreturn {};(这两者是相同的)则相对较少。

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

所以答案是肯定使用:

return std::string();

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

尽管除非在性能关键代码(我想是日志记录?)中返回大量空字符串,否则差异仍然微不足道。

后一个版本永远不会比前一个慢。第一个版本调用采用C字符串的std::string构造函数,然后它必须首先计算字符串的长度。尽管对于空字符串这样做很快,但肯定不会比根本不这样做快。