ในขณะที่มันเป็นความจริงที่พฤติกรรมที่มีการกำหนดไว้อย่างดี - มันไม่เป็นความจริงที่คอมไพเลอร์สามารถ "เพิ่มประสิทธิภาพสำหรับ 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เป็นเพียงคำแนะนำและความสะดวกสบายให้โปรแกรมเมอร์เพื่อช่วยหลีกเลี่ยงการแก้ไขวัตถุโดยไม่ได้ตั้งใจ