ใช่มันทำได้
const
s ส่วนใหญ่มีไว้เพื่อประโยชน์ของโปรแกรมเมอร์ล้วนๆและไม่ได้ช่วยให้คอมไพเลอร์ปรับแต่งได้ดีที่สุดเพราะมันถูกกฎหมายที่จะทิ้งมันไปดังนั้นพวกเขาจึงไม่บอกคอมไพเลอร์ว่ามีประโยชน์อะไรสำหรับการเพิ่มประสิทธิภาพ อย่างไรก็ตามบางส่วนconst
ไม่สามารถ (ตามกฎหมาย) ทิ้งได้และสิ่งเหล่านี้จะให้ข้อมูลที่เป็นประโยชน์แก่คอมไพเลอร์สำหรับการปรับให้เหมาะสม
ตัวอย่างเช่นการเข้าถึงตัวแปรส่วนกลางที่กำหนดด้วยconst
ประเภทสามารถอินไลน์ได้ในขณะที่ไม่สามารถอินไลน์อินไลน์ที่ไม่มีconst
ประเภทได้เนื่องจากอาจมีการเปลี่ยนแปลงเมื่อรันไทม์
https://godbolt.org/g/UEX4NB
C ++:
int foo1 = 1;
const int foo2 = 2;
int get_foo1() {
return foo1;
}
int get_foo2() {
return foo2;
}
asm:
foo1:
.long 1
foo2:
.long 2
get_foo1():
push rbp
mov rbp, rsp
mov eax, DWORD PTR foo1[rip] ; foo1 must be accessed by address
pop rbp
ret
get_foo2():
push rbp
mov rbp, rsp
mov eax, 2 ; foo2 has been replaced with an immediate 2
pop rbp
ret
ในทางปฏิบัติโปรดทราบว่าแม้ว่าconst
จะสามารถปรับปรุงประสิทธิภาพได้ แต่ในกรณีส่วนใหญ่จะไม่เกิดขึ้นหรือจะทำได้ แต่จะไม่สามารถสังเกตเห็นการเปลี่ยนแปลงได้ ประโยชน์หลักของconst
ไม่ใช่การเพิ่มประสิทธิภาพ
Steve Jessop ยกตัวอย่างอื่นในความคิดเห็นของเขาเกี่ยวกับคำถามเดิมซึ่งนำมาซึ่งสิ่งที่ควรค่าแก่การกล่าวถึง ในขอบเขตบล็อกเป็นไปได้ที่คอมไพลเลอร์จะอนุมานได้ว่าตัวแปรจะถูกกลายพันธุ์และปรับให้เหมาะสมหรือไม่โดยไม่คำนึงถึงconst
เนื่องจากคอมไพเลอร์สามารถเห็นการใช้ตัวแปรทั้งหมด ในทางตรงกันข้ามในตัวอย่างข้างต้นไม่สามารถคาดเดาได้ว่าfoo1
จะกลายพันธุ์หรือไม่เนื่องจากสามารถแก้ไขในหน่วยการแปลอื่นได้ ฉันคิดว่าคอมไพเลอร์อัลตร้าคอมไพเลอร์สมมุติสามารถวิเคราะห์โปรแกรมทั้งหมดและตรวจสอบว่าสามารถเข้าถึงแบบอินไลน์ได้หรือไม่foo1
... แต่คอมไพเลอร์จริงทำไม่ได้