Hãy xem xét chức năng sau:
void func(bool& flag)
{
if(!flag) flag=true;
}
Đối với tôi, có vẻ như nếu cờ có giá trị boolean hợp lệ, điều này sẽ tương đương với việc đặt nó thành true
, như thế này:
void func(bool& flag)
{
flag=true;
}
Tuy nhiên, cả gcc và clang đều không tối ưu hóa nó theo cách này - cả hai đều tạo ra những điều sau đây tại -O3
cấp độ tối ưu hóa:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Câu hỏi của tôi là: có phải mã quá đặc biệt để tối ưu hóa không, hay có bất kỳ lý do chính đáng nào khiến việc tối ưu hóa như vậy không mong muốn, vì điều đó flag
không phải là tham chiếu đến volatile
? Có vẻ như lý do duy nhất mà có thể là flag
bằng cách nào đó có thể có một phi true
-hoặc- false
giá trị mà không cần xác định hành vi tại thời điểm đọc nó, nhưng tôi không chắc liệu này là có thể.
1
được sử dụng. godbolt.org/g/swe0tc