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

时间:2014-10-27 11:59:42

标签: c++ string performance

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

1)

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

2)

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

哪一个更有效率,为什么?

2 个答案:

答案 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::stringreturn {};的工作量相对较少(这两个相同)。

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

所以答案是肯定使用:

return std::string();

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

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

答案 1 :(得分:3)

后一版本永远不会比第一版慢。第一个版本调用std::string构造函数采用C字符串,然后必须首先计算字符串的长度。尽管对于一个空字符串来说速度很快,但它肯定不会比没有完成它更快。