次の関数について考えてみましょう。
void func(bool& flag)
{
if(!flag) flag=true;
}
flagに有効なブール値がある場合、これは次のように無条件にを設定すること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