এটি উপলব্ধি করা জরুরী যে কম্পাইলারটি যে কোডটি তৈরি করে তাতে আপনার ডেটা স্ট্রাকচারের প্রকৃত জ্ঞান নেই (কারণ এ জাতীয় জিনিসটি সমাবেশ স্তরে উপস্থিত নেই), এবং অপটিমাইজারও নয়। সংকলক কেবল প্রতিটি ফাংশনের জন্য কোড উত্পাদন করে , ডেটা স্ট্রাকচার নয় ।
ঠিক আছে, এটি ধ্রুবক ডেটা বিভাগগুলি এবং এ জাতীয় লেখায়।
এর ভিত্তিতে আমরা ইতিমধ্যে বলতে পারি যে অপ্টিমাইজারটি সদস্যদের "অপসারণ" বা "অপসারণ" করবে না, কারণ এটি ডেটা স্ট্রাকচারকে আউটপুট দেয় না। এটা তোলে আউটপুট কোড , যা কি না পারে ব্যবহার সদস্য এবং তার লক্ষ্য মধ্যে অর্থহীন নির্মূল করে মেমরি বা চক্র সঞ্চয় ব্যবহারসমূহ (অর্থাত লিখেছেন / সার্চ) সদস্যদের।
এর সংক্ষিপ্তসারটি হ'ল "যদি সংকলক কোনও ফাংশনের সুযোগের মধ্যে এটি প্রমাণ করতে পারে (এর মধ্যে অন্তর্ভুক্ত ফাংশনগুলি সহ) যে অব্যবহৃত সদস্য কীভাবে ফাংশন পরিচালনা করে (এবং এটি কী ফিরে আসে) তাতে কোনও পার্থক্য নেই তবে সম্ভাবনাগুলি ভাল হয় সদস্যের উপস্থিতি কোনও ওভারহেডের কারণ হয় না।
আপনি যেমন বাইরের বিশ্বের সাথে কোনও ফাংশনের ইন্টারঅ্যাকশনগুলি সংকলকটির কাছে আরও জটিল / অস্পষ্ট করে তুলুন (আরও জটিল ডেটা স্ট্রাকচার গ্রহণ / ফিরিয়ে দিন, উদাহরণস্বরূপ std::vector<Foo>
, একটি আলাদা সংকলনের ইউনিটে কোনও ফাংশনের সংজ্ঞাটি আড়াল করুন, ইনলাইনিং নিষিদ্ধ / নিষিদ্ধকরণ ইত্যাদি) , এটি আরও বেশি করে হয়ে যায় যে সংকলকটি প্রমাণ করতে পারে না যে অব্যবহৃত সদস্যটির কোনও প্রভাব নেই।
এখানে কোনও কঠোর নিয়ম নেই কারণ এটি সমস্তই সংকলকটি তৈরি করা অপ্টিমাইজেশনের উপর নির্ভর করে, তবে যতক্ষণ না আপনি তুচ্ছ জিনিস করেন (যেমন ওয়াইএসসির উত্তরে দেখানো হয়) সম্ভবত খুব বেশি সম্ভাবনা রয়েছে যে কোনও ওভারহেড উপস্থিত হবে না, যখন জটিল জিনিসগুলি করছেন (যেমন ফিরে আসা) একটি std::vector<Foo>
একটি ফাংশন ইনলাইনিং এর জন্য অত্যন্ত বড় থেকে) সম্ভবত ওভারহেড বহন করতে হবে।
বিষয়টি ব্যাখ্যা করার জন্য, এই উদাহরণটি বিবেচনা করুন :
struct Foo {
int var1 = 3;
int var2 = 4;
int var3 = 5;
};
int test()
{
Foo foo;
std::array<char, sizeof(Foo)> arr;
std::memcpy(&arr, &foo, sizeof(Foo));
return arr[0] + arr[4];
}
আমরা এখানে নন-তুচ্ছ জিনিসগুলি করি ( বাইট উপস্থাপনার থেকে ঠিকানা গ্রহণ করুন, পরিদর্শন করুন এবং বাইটগুলি যুক্ত করুন ) এবং তবুও অপ্টিমাইজার সনাক্ত করতে পারে যে ফলাফলটি এই প্ল্যাটফর্মে সর্বদা একই থাকে:
test(): # @test()
mov eax, 7
ret
সদস্যরা কেবল Foo
কোনও স্মৃতি দখল Foo
করেনি , এমন কি একটি অস্তিত্বও আসে নি! যদি এমন অন্যান্য ব্যবহার রয়েছে যা অনুকূলিত করা যায় না তবে উদাহরণস্বরূপ sizeof(Foo)
ব্যাপারটি হতে পারে - তবে কেবলমাত্র সেই বিভাগের কোডের জন্য! যদি সমস্ত ব্যবহারগুলি var3
এটির মতো অনুকূলিত করা যায় তবে উদাহরণস্বরূপ অস্তিত্ব উত্পন্ন কোডটিকে প্রভাবিত করে না। এটি অন্য কোথাও ব্যবহার করা হলেও, test()
অপ্টিমাইজড থাকবে!
সংক্ষেপে: প্রতিটি ব্যবহার Foo
স্বাধীনভাবে অনুকূলিত হয়। কিছু অপ্রয়োজনীয় সদস্যের কারণে কিছু বেশি স্মৃতি ব্যবহার করতে পারে, কেউ না পারে। আরও তথ্যের জন্য আপনার সংকলক ম্যানুয়াল পরামর্শ করুন।