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

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::stringreturn {};(这两个是相同的).

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

所以答案是肯定使用:

return std::string();
Run Code Online (Sandbox Code Playgroud)

要么

return {};   //(c++11)
Run Code Online (Sandbox Code Playgroud)

虽然除非你在性能关键代码中返回很多空字符串(我猜是记录?),但差别仍然是微不足道的.

  • 也许这需要从2017年开始进行更新,所有三种可能的返回结果都与结果相同,因此返回“”或std :: string {}或{}不会有问题。在clang和gcc的编译器资源管理器上测试 (2认同)
  • 还值得注意的是`return {};`是C ++扩展,因此应首选`return std :: string();`。 (2认同)