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 truewie folgt entspricht:
void func(bool& flag)
{
flag=true;
}
Weder gcc noch clang optimieren es auf diese Weise - beide generieren auf -O3Optimierungsebene 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 flagkein Verweis auf ist volatile? Es scheint der einzige Grund zu sein, der sein könnte, dass er zum Zeitpunkt des Lesens flageinen Nicht- trueoder- falseWert ohne undefiniertes Verhalten haben könnte, aber ich bin mir nicht sicher, ob dies möglich ist.
1Verwendung. godbolt.org/g/swe0tc