Рассмотрим следующую функцию:
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 -or- false без undefined поведения в точке его чтения, но я не уверен, что это возможно.