【发布时间】:2023-04-04 11:55:01
【问题描述】:
考虑这段代码:
#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
这两个函数的含义有区别吗? 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
【问题讨论】:
-
似乎你应该提出一个 QoI 错误 - 我们在这里无能为力!
-
@LightnessRacesinOrbit 问题是“有什么区别......”只有当答案是“否”时(至少对我来说这不是那么明显)我会转向 gcc 与 QoI 错误
-
...也许添加语言律师标签?
-
检查这个...godbolt.org/z/dxrjn6 从
a的末尾删除{},现在慢与快完全一样。 -
似乎没有太多逻辑。从类中删除
b。如果a有{},那么慢速和快速是2 条指令并且相同。如果a没有{},那么慢是两条指令,快是12 条指令。 godbolt.org/z/88eLqc
标签: c++ gcc optimization g++