বনভ.
বেশিরভাগই const
নিখুঁতভাবে প্রোগ্রামারটির সুবিধার জন্য এবং সংকলকটিকে অপ্টিমাইজ করতে সহায়তা করে না কারণ এগুলি তাদের ফেলে দেওয়া আইনী এবং তাই তারা সংযোজকটিকে অপ্টিমাইজেশনের জন্য দরকারী কিছু না বলে। তবে কিছু কিছু const
(আইনত) ফেলে দেওয়া যায় না এবং এটি সংযোজনকারীকে অনুকূলিতকরণের জন্য দরকারী তথ্য সরবরাহ করে with
উদাহরণস্বরূপ, কোনও const
প্রকারের সাথে সংজ্ঞায়িত গ্লোবাল ভেরিয়েবলের অ্যাক্সেস অন্তর্নিহিত করা যেতে পারে তবে কোনও প্রকারবিহীন কোনওটিকে linedোকানো যায় const
না কারণ এটি রানটাইমে পরিবর্তিত হতে পারে।
https://godbolt.org/g/UEX4NB
সি ++:
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
অপ্টিমাইজেশন নয়।
স্টিভ জেসোপ মূল প্রশ্নে তাঁর মন্তব্যে আরেকটি উদাহরণ দিয়েছেন যা উল্লেখযোগ্য কিছু বিষয় নিয়ে আসে। একটি ব্লক স্কোপে, কোনও সংকলকটির পক্ষে কোনও পরিবর্তনশীলকে রূপান্তরিত করা এবং const
নির্ধারিতভাবে নির্ধারিত অনুসারে অপ্টিমাইজ করা হবে কিনা তা নির্ধারণ করা সম্ভব , কারণ সংকলকটি চলকটির সমস্ত ব্যবহার দেখতে পারে। বিপরীতে, উপরের উদাহরণে, foo1
অন্য অনুবাদ ইউনিটগুলিতে এটি সংশোধন করা হতে পারে তা রূপান্তরিত হবে কিনা তা ভবিষ্যদ্বাণী করা অসম্ভব । আমি অনুমান করি যে একটি অনুমানী সংবেদনশীল অতি-সংকলক একটি সম্পূর্ণ প্রোগ্রাম বিশ্লেষণ করতে পারে এবং নির্ধারণ করতে পারে যে এটিতে প্রবেশপথের প্রবেশপথের বৈধতা আছে কিনা foo1
... তবে বাস্তব সংকলকরা তা করতে পারে না।