Considere a seguinte função:
void func(bool& flag)
{
if(!flag) flag=true;
}
Parece-me que se o sinalizador tiver um valor booleano válido, isso seria equivalente a defini-lo true
como incondicional , assim:
void func(bool& flag)
{
flag=true;
}
No entanto, nem o gcc nem o clang o otimizam dessa maneira - ambos geram o seguinte no -O3
nível de otimização:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Minha pergunta é: é apenas que o código é muito especial para cuidar de otimizar, ou há algum bom motivo para tal otimização ser indesejada, visto que flag
não é uma referência volatile
? Parece que a única razão que pode ser é que flag
poderia, de alguma forma, ter um não- true
ou- false
valor sem comportamento indefinido no momento da leitura, mas não tenho certeza se isso é possível.
1
sendo usada. godbolt.org/g/swe0tc