Considérons la fonction suivante :
void func(bool& flag)
{
if(!flag) flag=true;
}
Il me semble que si flag a une valeur booléenne valide, cela équivaudrait à lui donner inconditionnellement la valeur suivante true
comme ceci :
void func(bool& flag)
{
flag=true;
}
Pourtant, ni gcc ni clang ne l'optimisent de cette façon - tous deux génèrent ce qui suit à l'adresse suivante -O3
niveau d'optimisation :
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Ma question est la suivante : est-ce que le code est simplement un cas trop spécial pour se soucier de l'optimiser, ou y a-t-il de bonnes raisons pour lesquelles une telle optimisation ne serait pas souhaitée, étant donné que flag
n'est pas une référence à volatile
? Il semble que la seule raison qui pourrait l'être soit que flag
pourrait en quelque sorte avoir un non true
-ou- false
sans comportement indéfini au moment de sa lecture, mais je ne suis pas sûr que cela soit possible.