Сделал некоторые копания. Ниже приведен пример программы и соответствующая сборка:
Код:
#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::string
и return {};
(эти два идентичны).
Как сказал Фрерих Раабе при передаче пустого C_string
, ему все же необходимо обработать его, а не просто выделить память. Кажется, что это не может быть оптимизировано далеко (по крайней мере, не НКУ)
Так что ответ определенно использовать:
return std::string();
или
return {}; //(c++11)
Хотя, если вы не возвращаются много пустых строк в критическом кривом производительности (ведение журнала, я думаю?), разница будет по-прежнему незначительной.
Ни то, ни другое. Используйте 'return {};'. –
И как это относится к C? – crashmstr
Это попадает в сферу бесполезной микро-оптимизации, которую ваш компилятор будет оптимизировать, используя RVO и копию elision. – CoryKramer