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 -O3niveau 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 flagne s'agit pas d'une référence volatile? Il semble que la seule raison qui pourrait être est que cela flagpourrait d'une manière ou d'une autre avoir une valeur non- trueou- falsesans comportement indéfini au moment de la lecture, mais je ne suis pas sûr que cela soit possible.
1. godbolt.org/g/swe0tc