Rozważ następującą funkcję:
void func(bool& flag)
{
if(!flag) flag=true;
}
Wydaje mi się, że jeśli flaga ma prawidłową wartość logiczną, byłoby to równoważne z bezwarunkowym ustawieniem jej na true, na przykład:
void func(bool& flag)
{
flag=true;
}
Jednak ani gcc, ani clang nie optymalizują go w ten sposób - oba generują następujące informacje na -O3poziomie optymalizacji:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Moje pytanie brzmi: czy po prostu kod jest zbyt szczególny, aby go zoptymalizować, czy też istnieją dobre powody, dla których taka optymalizacja byłaby niepożądana, biorąc pod uwagę, że flagnie jest to odniesienie volatile? Wydaje się, że jedynym powodem, który może być, jest to, że flagmoże w jakiś sposób mieć wartość inną niż - truelub - falsebez niezdefiniowanego zachowania w momencie czytania, ale nie jestem pewien, czy jest to możliwe.
1użycie stałej czasowej kompilacji . godbolt.org/g/swe0tc