Розглянемо наступну функцію:
void func(bool& flag)
{
if(!flag) flag=true;
}
Мені здається, що якщо прапор має дійсне булеве значення, це було б рівнозначно беззастережному встановленню його true
, як-от так:
void func(bool& flag)
{
flag=true;
}
Але ні gcc, ні clang не оптимізують його таким чином - обидва генерують наступне на -O3
рівні оптимізації:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Моє запитання: це просто те, що код є надто особливим випадком для оптимізації, чи є якісь вагомі причини, чому така оптимізація була б небажаною, враховуючи, що flag
це не посилання volatile
? Здається, єдиною причиною може бути те, що flag
якимось чином можна було б мати true
неозначувану false
цінність без невизначеної поведінки в момент її читання, але я не впевнений, чи можливо це.
1
використовується константа часу компіляції . godbolt.org/g/swe0tc