ในขณะที่มันเป็นความจริงที่พฤติกรรมที่มีการกำหนดไว้อย่างดี - มันไม่เป็นความจริงที่คอมไพเลอร์สามารถ "เพิ่มประสิทธิภาพสำหรับ const" ในแง่ที่คุณหมายถึง
นั่นคือคอมไพเลอร์ไม่ได้รับอนุญาตสมมติว่าเพียงเพราะพารามิเตอร์เป็นconst T* ptr
หน่วยความจำที่ชี้ไปตามptr
จะไม่ถูกเปลี่ยนผ่านตัวชี้อื่น พอยน์เตอร์ไม่จำเป็นต้องเท่ากัน const
เป็นภาระหน้าที่ไม่รับประกัน - ภาระผูกพันโดยคุณ (= ฟังก์ชั่น) จะไม่ทำการเปลี่ยนแปลงผ่านตัวชี้ว่า
เพื่อให้มีการรับประกันจริงนั้นคุณต้องทำเครื่องหมายตัวชี้ด้วยrestrict
คำสำคัญ ดังนั้นถ้าคุณรวบรวมทั้งสองฟังก์ชั่น:
int foo(const int* x, int* y) {
int result = *x;
(*y)++;
return result + *x;
}
int bar(const int* x, int* restrict y) {
int result = *x;
(*y)++;
return result + *x;
}
foo()
ฟังก์ชั่นจะต้องอ่านสองครั้งจากx
ในขณะที่bar()
เพียงต้องการที่จะอ่านมันครั้งเดียว:
foo:
mov eax, DWORD PTR [rdi]
add DWORD PTR [rsi], 1
add eax, DWORD PTR [rdi] # second read
ret
bar:
mov eax, DWORD PTR [rdi]
add DWORD PTR [rsi], 1
add eax, eax # no second read
ret
ดูรายการสดGodBoltนี้
restrict
เป็นเพียงคำหลักใน C (ตั้งแต่ C99) โชคไม่ดีที่มันยังไม่ได้ถูกนำมาใช้ใน C ++ จนถึงขณะนี้ (ด้วยเหตุผลที่ไม่ดีที่มีความซับซ้อนมากกว่าในการแนะนำใน C ++) คอมไพเลอร์หลายคนทำครับ-สนับสนุนมัน __restrict
แต่เป็น
Bottom line: คอมไพเลอร์จะต้องรองรับกรณีการใช้ "ความลับ" ของคุณเมื่อรวบรวมf()
และจะไม่มีปัญหาใด ๆ
ดูโพสต์นี้restrict
เกี่ยวกับกรณีการใช้งานสำหรับ
const
ไม่ใช่“ ข้อผูกพันของคุณ (= ฟังก์ชั่น) ที่จะไม่ทำการเปลี่ยนแปลงผ่านตัวชี้นั้น” มาตรฐาน C อนุญาตให้ฟังก์ชันลบออกconst
จากการร่ายแล้วปรับเปลี่ยนวัตถุผ่านผลลัพธ์ เป็นหลักconst
เป็นเพียงคำแนะนำและความสะดวกสบายให้โปรแกรมเมอร์เพื่อช่วยหลีกเลี่ยงการแก้ไขวัตถุโดยไม่ได้ตั้งใจ