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