พิจารณาฟังก์ชันต่อไปนี้:
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