Considere la siguiente función:
void func(bool& flag)
{
if(!flag) flag=true;
}
Me parece que si la bandera tiene un valor booleano válido, esto sería equivalente a configurarlo incondicionalmente true, así:
void func(bool& flag)
{
flag=true;
}
Sin embargo, ni gcc ni clang lo optimizan de esta manera; ambos generan lo siguiente en el -O3nivel de optimización:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Mi pregunta es: ¿es solo que el código es un caso demasiado especial para preocuparse por optimizarlo, o hay buenas razones por las que dicha optimización no sería deseada, dado que flagno es una referencia a volatile? Parece que la única razón que podría ser es que de flagalguna manera podría tener un valor no true-o- falsesin un comportamiento indefinido en el momento de leerlo, pero no estoy seguro de si esto es posible.
1uso. godbolt.org/g/swe0tc