Considérez la fonction suivante:
void func(bool& flag)
{
if(!flag) flag=true;
}
Il me semble que si l'indicateur a une valeur booléenne valide, cela équivaudrait à le définir inconditionnellement true
, comme ceci:
void func(bool& flag)
{
flag=true;
}
Pourtant, ni gcc ni clang ne l'optimisent de cette façon - les deux génèrent les éléments suivants au -O3
niveau de l'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 simplement que le code est trop spécial pour être optimisé, ou y a-t-il de bonnes raisons pour lesquelles une telle optimisation serait indésirable, étant donné qu'il flag
ne s'agit pas d'une référence volatile
? Il semble que la seule raison qui pourrait être est que cela flag
pourrait d'une manière ou d'une autre avoir une valeur non- true
ou- false
sans comportement indéfini au moment de la lecture, mais je ne suis pas sûr que cela soit possible.
1
. godbolt.org/g/swe0tc