考虑以下功能:
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