हालांकि यह सच है कि व्यवहार अच्छी तरह से परिभाषित है - यह सच नहीं है कि संकलक इस अर्थ में "कास्ट के लिए अनुकूलन" कर सकते हैं जिसका अर्थ है।
यही है, एक संकलक को यह मानने की अनुमति नहीं है कि सिर्फ इसलिए कि एक पैरामीटर एक है 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।
restrictC में केवल एक कीवर्ड है (C99 के बाद से); दुर्भाग्य से, इसे अभी तक C ++ में पेश नहीं किया गया है (खराब कारण के लिए जो इसे C ++ में पेश करने के लिए अधिक जटिल है)। कई कंपाइलर थोड़े सपोर्ट करते हैं, हालाँकि, जैसा कि __restrict।
नीचे पंक्ति: संकलक को संकलन करते समय आपके "गूढ़" उपयोग मामले का समर्थन करना चाहिए f(), और इसके साथ कोई समस्या नहीं होगी।
के लिए उपयोग मामलों के बारे में यह पोस्ट देखें restrict।
constनहीं है "आप (= समारोह) द्वारा एक दायित्व उस सूचक के माध्यम से परिवर्तन करने के लिए नहीं"। सी मानकconstएक डाली के माध्यम से समारोह को हटाने और फिर परिणाम के माध्यम से वस्तु को संशोधित करने की अनुमति देता है । अनिवार्य रूप से,constकिसी वस्तु को अनजाने में संशोधित करने से बचने में मदद करने के लिए सिर्फ सलाहकार और प्रोग्रामर के लिए एक सुविधा है।