Рассмотрим следующую функцию:
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