考虑这段代码:
#include <array>
class C
{
std::array<char, 7> a{};
int b{};
};
C slow()
{
return {};
}
C fast()
{
C c;
return c;
}
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
这两个函数的含义有区别吗?Clangfast()
为两者都发出类似的代码,而 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