#include <string>
std::string foo1()
{
return "";
}
std::string foo2()
{
return {};
}
int main()
{
const std::string& test1 = foo1();
const std::string& test2 = foo2();
return 0;
}
Clang 3.8与-O3
做了这个:
foo1(): # @foo1()
push rbx
sub rsp, 16
mov rbx, rdi
lea rdx, [rsp + 8]
mov esi, .L.str
call std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
mov rax, rbx
add rsp, 16
pop rbx
ret
foo2(): # @foo2()
mov qword ptr [rdi], std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storage+24
mov rax, rdi
ret
但是GCC做了这个(即相同的代码):
foo1[abi:cxx11]():
lea rdx, [rdi+16]
mov rax, rdi
mov QWORD PTR [rdi+8], 0
mov BYTE PTR [rdi+16], 0
mov QWORD PTR [rdi], rdx
ret
foo2[abi:cxx11]():
lea rdx, [rdi+16]
mov rax, rdi
mov QWORD PTR [rdi+8], 0
mov BYTE PTR [rdi+16], 0
mov QWORD PTR [rdi], rdx
ret
为什么Clang即使在最后一个版本中也没有优化""
的回报?标准中是否有任何理由,或者他们忘了它?