関数から空の文字列を返す方法は 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::string
return {};
Frerich Raabe が言ったように、空の を渡すときはC_string
、メモリを割り当てるだけでなく、それに対して処理を行う必要があります。これは最適化できないようです (少なくとも GCC では)。
したがって、答えは間違いなく以下を使用することです。
return std::string();
または
return {}; //(c++11)
ただし、帰国しない限りたくさんパフォーマンスが重要なコード (ログ記録でしょうか?) に空の文字列が含まれていても、その差は依然としてわずかです。