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 -O3
poziomie 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 flag
nie jest to odniesienie volatile
? Wydaje się, że jedynym powodem, który może być, jest to, że flag
może w jakiś sposób mieć wartość inną niż - true
lub - false
bez niezdefiniowanego zachowania w momencie czytania, ale nie jestem pewien, czy jest to możliwe.
1
użycie stałej czasowej kompilacji . godbolt.org/g/swe0tc