যদিও এটি সত্য যে আচরণটি সুস্পষ্টভাবে সংজ্ঞায়িত হয়েছে - এটি ঠিক নয় যে কম্পাইলাররা আপনার বোঝার অর্থটি "কনস্টের জন্য অনুকূলিত করতে" পারেন।
অর্থাত, একটি সংকলককে ধরে নিতে দেওয়া হয় না যে কেবলমাত্র প্যারামিটারটি হ'ল 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
সি তে কেবল একটি কীওয়ার্ড (সি 99 থেকে); দুর্ভাগ্যক্রমে, এটি এখন পর্যন্ত সি ++ তে প্রবর্তিত হয়নি (খারাপ কারণে যে এটি সি ++ তে প্রবর্তন করা আরও জটিল)। অনেক সংকলক এটি কিন্ডা-সমর্থন করেন, তবে, হিসাবে __restrict
।
নীচের লাইন: সংকলকটি সংকলনের সময় অবশ্যই আপনার "রহস্যজনক" ব্যবহারের ক্ষেত্রে সমর্থন f()
করবে এবং এতে কোনও সমস্যা হবে না।
জন্য ব্যবহারের ক্ষেত্রে সম্পর্কিত এই পোস্টটি দেখুন restrict
।
const
"আপনার দ্বারা কোনও বাধ্যবাধকতা নয় (= ফাংশন) সেই পয়েন্টারের মাধ্যমে পরিবর্তন না করা"। সি স্ট্যান্ডার্ড ফাংশনটিকেconst
একটি কাস্টের মাধ্যমে সরিয়ে ফেলার অনুমতি দেয় এবং তারপরে ফলাফলের মাধ্যমে অবজেক্টটি সংশোধন করে। মূলত,const
অজান্তে কোনও বস্তুর সংশোধন এড়াতে সহায়তা করার জন্য প্রোগ্রামারের কাছে কেবল পরামর্শদাতা এবং একটি সুবিধা।