Pertimbangkan fungsi berikut:
void func(bool& flag)
{
if(!flag) flag=true;
}
Menurut saya, jika flag memiliki nilai boolean yang valid, ini akan setara dengan pengaturan tanpa syarat true
, seperti ini:
void func(bool& flag)
{
flag=true;
}
Namun baik gcc maupun clang tidak mengoptimalkannya dengan cara ini - keduanya menghasilkan yang berikut pada -O3
tingkat pengoptimalan:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Pertanyaan saya adalah: apakah hanya karena kodenya terlalu kasus khusus untuk dirawat untuk dioptimalkan, atau adakah alasan bagus mengapa pengoptimalan seperti itu tidak diinginkan, mengingat itu flag
bukan referensi volatile
? Tampaknya satu-satunya alasan yang mungkin adalah bahwa flag
entah bagaimana bisa memiliki nilai non- true
atau false
tanpa perilaku yang tidak terdefinisi pada saat membacanya, tetapi saya tidak yakin apakah ini mungkin.
1
yang digunakan. godbolt.org/g/swe0tc