考虑以下函数:
void func(bool& flag)
{
if(!flag) flag=true;
}
我认为,如果标志具有有效的布尔值,这将等同于无条件将其设置为 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
被使用。https://godbolt.org/g/swe0tc - Evan Teran