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 -O3
livello 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 flag
non è un riferimento volatile
? Sembra che l'unica ragione che potrebbe essere è che flag
potesse in qualche modo avere un non- true
oppure false
valore senza un comportamento indefinito in corrispondenza del punto di leggerlo, ma non sono sicuro se questo è possibile.
1
utilizzata. godbolt.org/g/swe0tc