Betrachten Sie die folgende Funktion:
void func(bool& flag)
{
if(!flag) flag=true;
}
Es scheint mir, dass wenn ein Flag einen gültigen booleschen Wert hat, dies einer bedingungslosen Einstellung true
wie folgt entspricht:
void func(bool& flag)
{
flag=true;
}
Weder gcc noch clang optimieren es auf diese Weise - beide generieren auf -O3
Optimierungsebene Folgendes :
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Meine Frage ist: Ist der Code nur zu speziell, um ihn zu optimieren, oder gibt es gute Gründe, warum eine solche Optimierung unerwünscht wäre, da dies flag
kein Verweis auf ist volatile
? Es scheint der einzige Grund zu sein, der sein könnte, dass er zum Zeitpunkt des Lesens flag
einen Nicht- true
oder- false
Wert ohne undefiniertes Verhalten haben könnte, aber ich bin mir nicht sicher, ob dies möglich ist.
1
Verwendung. godbolt.org/g/swe0tc