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 -O3
nivel 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 flag
no es una referencia a volatile
? Parece que la única razón que podría ser es que de flag
alguna manera podría tener un valor no true
-o- false
sin un comportamiento indefinido en el momento de leerlo, pero no estoy seguro de si esto es posible.
1
uso. godbolt.org/g/swe0tc