为什么Clang不优化std :: string的返回空“”常量?

时间:2016-07-05 16:57:27

标签: c++ string gcc optimization clang

#include <string>

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

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

int main()
{
    const std::string& test1 = foo1();
    const std::string& test2 = foo2();

    return 0;
}

https://godbolt.org/g/ifgNbl

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即使在最后一个版本中也没有优化""的回报?标准中是否有任何理由,或者他们忘了它?

0 个答案:

没有答案