空の文字列を返す: C++ での効率的な方法 質問する

空の文字列を返す: C++ での効率的な方法 質問する

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

1)

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

2)

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

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

ベストアンサー1

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

ステートメントの作業量はかなり多く、 andreturn "";の作業量は比較的少ないことがわかります(これら 2 つは同一です)。return std::stringreturn {};

Frerich Raabe が言ったように、空の を渡すときはC_string、メモリを割り当てるだけでなく、それに対して処理を行う必要があります。これは最適化できないようです (少なくとも GCC では)。

したがって、答えは間違いなく以下を使用することです。

return std::string();

または

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

ただし、帰国しない限りたくさんパフォーマンスが重要なコード (ログ記録でしょうか?) に空の文字列が含まれていても、その差は依然としてわずかです。

おすすめ記事