除非返回值具有名称,否则为什么GCC无法优化?

Joh*_*nck 8 c++ optimization gcc g++

考虑以下代码:

#include <array>

class C
{
    std::array<char, 7> a{};
    int b{};
};

C slow()
{
    return {};
}

C fast()
{
    C c;
    return c;
}
Run Code Online (Sandbox Code Playgroud)

GCC 6到9产生了非常肿的代码slow()

slow():
        xor     eax, eax
        mov     DWORD PTR [rsp-25], 0
        mov     BYTE PTR [rsp-21], 0
        mov     edx, DWORD PTR [rsp-24]
        mov     DWORD PTR [rsp-32], 0
        mov     WORD PTR [rsp-28], ax
        mov     BYTE PTR [rsp-26], 0
        mov     rax, QWORD PTR [rsp-32]
        ret
fast():
        xor     eax, eax
        xor     edx, edx
        ret
Run Code Online (Sandbox Code Playgroud)

两种功能在含义上有区别吗?Clang会发出fast()两种代码,而GCC 4-5比6-9更好,但也不是最优。

构建标志: -std=c++11 -O3

演示:https//godbolt.org/z/rPNG9o


根据此处的反馈作为GCC错误提交:https : //gcc.gnu.org/bugzilla/show_bug.cgi?id=90883

Joh*_*nck 1

GCC 维护者同意这是一个错误(错过了优化),并且已在 x86_64 的主干中修复(ARM 可能稍后修复):https://gcc.gnu.org/bugzilla/show_bug.cgi ?id=90883