gpt4 book ai didi

c++ - 在比较 2 个短裤的过度对齐结构时,gcc 是否错过了优化机会?

转载 作者:行者123 更新时间:2023-12-03 16:13:45 25 4
gpt4 key购买 nike

我想知道 GCC 是否会使用我创建的结构过度对齐的知识,并在生成比较 asm 时将其简单地视为整数。

它不是。
我想知道这是由于 ABI 问题,还是我错过了其他一些因素,还是真的缺少优化?

godbolt link

代码:

struct S{
short a,b;
bool operator == (const S&) const = default;
};

struct alignas(alignof(int)) S2 {
short a,b;
bool operator == (const S2&) const = default;
};

bool f(const S& s){
constinit static S c{11,22};
return c==s;
}

bool f2(const S2& s2){
constinit static S2 c2{11,22};
return c2==s2;
}

static_assert(alignof(S)==2);
static_assert(alignof(S2)==4);

最佳答案

这很可能是一个错过的优化。仅替换 default ed 比较运算符与手动实现导致 32 位比较在过对齐的结构版本中输出。 IE。这个

struct alignas(alignof(int)) S4
{
short a,b;
bool operator == (const S4& s) const { return a==s.a && b==s.b; }
};
bool f4(const S4& s)
{
constinit static S4 c{11,22};
return c==s;
}

结果如下:
f4(S4 const&):
mov eax, DWORD PTR [rdi]
cmp DWORD PTR f4(S4 const&)::c[rip], eax
sete al
ret

在这个版本中显然错过了另一个优化(使 c 成为立即操作数以产生 cmp eax, 0x16000b ),但至少没有单独的 16 位比较。

full playground使用您的两个版本和两个手动定义的运算符。

关于c++ - 在比较 2 个短裤的过度对齐结构时,gcc 是否错过了优化机会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59458783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com