考虑以下功能:
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值而没有未定义的行为,但是我不确定这是否可能。
1。 godbolt.org/g/swe0tc