【发布时间】:2017-03-11 05:37:16
【问题描述】:
考虑以下函数:
void func(bool& flag)
{
if(!flag) flag=true;
}
在我看来,如果 flag 具有有效的布尔值,这相当于无条件将其设置为 true,如下所示:
void func(bool& flag)
{
flag=true;
}
然而 gcc 和 clang 都没有以这种方式对其进行优化——两者都在 -O3 优化级别生成以下内容:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
我的问题是:是否只是代码太特殊而无法优化,或者有什么充分的理由不希望进行这种优化,因为flag 不是对volatile 的引用?似乎唯一的原因可能是flag 可能以某种方式具有非true-或-false 值而在阅读时没有未定义的行为,但我不确定这是否可能。
【问题讨论】:
-
你有任何证据表明这是一种“优化”吗?
-
@200_success 我不认为将带有非工作标记的代码行作为标题是一件好事。如果你想要一个更具体的标题,可以但是选择一个英文句子,并尽量避免其中的代码(例如为什么编译器不优化条件写入到无条件写入何时可以证明它们是等价的? 或类似)。此外,由于不呈现反引号,即使您使用代码,也不要在标题中使用它们。
-
@Ruslan,虽然它似乎没有对函数本身进行这种优化,但当它可以内联代码时,它似乎确实对内联版本这样做了。通常只会导致使用
1的编译时间常数。 godbolt.org/g/swe0tc
标签: c++ optimization