1. ホーム
  2. c++

[解決済み] 空の文字列を返す:c++の効率的な方法

2022-03-01 22:48:53

質問

ある関数から空の文字列を返すには2つの方法があります。

1)

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

2)

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

どちらがより効率的か、またその理由は?

解決方法は?

<ブロッククオート

Gcc 7.1 -O3 これらはすべて同じです, 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 {}; (この2つは同じです)。

Frerich Raabeが言ったように、空の C_string の場合、単にメモリを確保するだけでなく、その処理も必要です。 これは(少なくともGCCでは)最適化できないようです。

だから、答えは絶対に使うことです。

return std::string();

または

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

を返しているのでなければ たくさん パフォーマンス重視のコード(ロギングとか?)では、この差はまだ小さいと思います。