Considera la seguente funzione:
void func(bool& flag)
{
if(!flag) flag=true;
}
Mi sembra che se flag ha un valore booleano valido, questo sarebbe equivalente all'impostazione incondizionata su true, in questo modo:
void func(bool& flag)
{
flag=true;
}
Tuttavia, né gcc né clang lo ottimizzano in questo modo, entrambi generano quanto segue a -O3livello di ottimizzazione:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
La mia domanda è: è solo che il codice è troppo speciale per preoccuparsi di ottimizzarlo, o ci sono buone ragioni per cui tale ottimizzazione sarebbe indesiderata, dato che flagnon è un riferimento volatile? Sembra che l'unica ragione che potrebbe essere è che flagpotesse in qualche modo avere un non- trueoppure falsevalore senza un comportamento indefinito in corrispondenza del punto di leggerlo, ma non sono sicuro se questo è possibile.
1utilizzata. godbolt.org/g/swe0tc