অন্যান্য উত্তরগুলি যথাযথভাবে পরামর্শ হিসাবে, __builtin_expect
সংকলকটিকে কীভাবে সমাবেশ কোডটি সাজানো যায় সে সম্পর্কে একটি ইঙ্গিত দিতে আপনি ব্যবহার করতে পারেন । অফিসিয়াল ডকস হিসাবে উল্লেখ করা হয়েছে, বেশিরভাগ ক্ষেত্রে, আপনার মস্তিষ্কে তৈরি এসেম্ব্লার জিসিসি টিমের তৈরি কারিগরের চেয়ে ভাল হবে না। অনুমান করার পরিবর্তে আপনার কোডটি অনুকূলকরণের জন্য প্রকৃত প্রোফাইল ডেটা ব্যবহার করা সর্বদা সেরা।
অনুরূপ লাইনের পাশাপাশি, তবে এখনও উল্লেখ করা হয়নি, একটি "ঠান্ডা" পথে সংকলককে কোড উত্পন্ন করতে বাধ্য করার এক জিসিসি-নির্দিষ্ট উপায়। এর মধ্যে noinline
ও cold
বৈশিষ্ট্যগুলির ব্যবহার জড়িত , যা তারা যা বলে ঠিক তেমন করে। এই বৈশিষ্ট্যগুলি কেবল ফাংশনে প্রয়োগ করা যেতে পারে তবে সি ++ 11 এর মাধ্যমে আপনি ইনলাইন ল্যাম্বদা ফাংশনগুলি ঘোষণা করতে পারেন এবং এই দুটি বৈশিষ্ট্যটি ল্যাম্বদা ফাংশনেও প্রয়োগ করা যেতে পারে।
যদিও এটি এখনও একটি মাইক্রো-অপ্টিমাইজেশনের সাধারণ বিভাগে আসে এবং এইভাবে স্ট্যান্ডার্ড পরামর্শটি প্রয়োগ হয় — পরীক্ষা অনুমান করবেন না — আমি মনে করি এটি এর চেয়ে বেশি কার্যকর __builtin_expect
। X86 প্রসেসরের কোনও প্রজন্মই শাখা প্রেডিকশন ইঙ্গিতগুলি ( রেফারেন্স ) ব্যবহার করে না, সুতরাং আপনি যেভাবেই প্রভাব ফেলতে সক্ষম হচ্ছেন সেটি হ'ল সমাবেশ কোডের ক্রম of যেহেতু আপনি জানেন যে ত্রুটি-পরিচালনা বা "এজ কেস" কোডটি কী তাই আপনি এই টীকাটি ব্যবহার করে এটি নিশ্চিত করতে পারেন যে কম্পাইলারটি এর সাথে কোনও শাখার পূর্বাভাস দেয় না এবং আকারের জন্য অনুকূলিত করার সময় এটিকে "হট" কোড থেকে দূরে সরিয়ে রাখবে।
নমুনা ব্যবহার:
void FooTheBar(void* pFoo)
{
if (pFoo == nullptr)
{
// Oh no! A null pointer is an error, but maybe this is a public-facing
// function, so we have to be prepared for anything. Yet, we don't want
// the error-handling code to fill up the instruction cache, so we will
// force it out-of-line and onto a "cold" path.
[&]() __attribute__((noinline,cold)) {
HandleError(...);
}();
}
// Do normal stuff
⋮
}
আরও ভাল, জিসিসি এটি উপলব্ধ হলে প্রোফাইল প্রতিক্রিয়ার পক্ষে স্বয়ংক্রিয়ভাবে এটিকে অগ্রাহ্য করবে (যেমন, সংকলন করার সময় -fprofile-use
)।
অফিসিয়াল ডকুমেন্টেশন এখানে দেখুন: https://gcc.gnu.org/onlinesocs/gcc/Common-Function-Attributes.html#Common-Function-Aribributes