विषय पर बढ़ें

अंतिम अद्यतन:2026-10-12

C++20 [[likely]] और [[unlikely]]

C++20 ने [[likely]] और [[unlikely]] ये दो संभाव्यता एट्रिब्यूट पेश किए, ये कंपाइलर को optimization संकेत देते हैं, यह बताते हुए कि संबंधित कोड path के निष्पादित होने की संभावना है/नहीं है।

पहली नज़र में, ये बढ़िया एट्रिब्यूट लगते हैं, कंपाइलर optimization से परफ़ॉर्मेंस बढ़ेगी। लेकिन वास्तविकता ऐसी नहीं है।

C++ स्टैंडर्ड ड्राफ़्ट में स्पष्ट रूप से कहा गया है: Excessive usage of either of these attributes is liable to result in performance degradation.

यानी: किसी भी एट्रिब्यूट का अत्यधिक उपयोग परफ़ॉर्मेंस गिरावट ला सकता है।

https://eel.is/c++draft/dcl.attr.likelihood#note-2

तो किन स्थितियों में ये उपयोगी हैं, और किन स्थितियों में ज़रूरत नहीं?

इस लेख में अपने विचार रखता हूँ।

1. सिद्धांत

उपयोग करते समय इन सिद्धांतों का पालन करना चाहिए:

  1. सावधानी से उपयोग: केवल तब इन एट्रिब्यूट का उपयोग करें जब आप निश्चित हों कि कोई branch या path runtime पर अत्यंत संभावित है या असंभावित।

उदाहरण के लिए: नीचे value के 0 से बड़ा होने की जाँच की गई है, यदि इनपुट डेटा की गारंटी न हो कि value बहुत अधिक संभावना से/निश्चित रूप से 0 से बड़ा है, तो यह optimization किसी काम की नहीं।

if (value > 0) [[likely]] {
    std::cout << "Value is positive: " << value << std::endl;
} else [[unlikely]] {
    std::cout << "Value is non-positive: " << value << std::endl;
}

उदाहरण के लिए: स्टैंडर्ड लाइब्रेरी में unlikely का उपयोग। _Variant_storage संरचना के मेंबर फ़ंक्शन में यह एट्रिब्यूट उपयोग हुआ है, अमान्य होने की संभावना अत्यंत कम है, इसलिए unlikely से चिह्नित किया जा सकता है।

constexpr void
_M_reset()
{
  if (!_M_valid()) [[unlikely]]
    return;

  // do something
}
  1. प्रधान path चिह्नित करें: केवल प्रधान निष्पादन path पर एट्रिब्यूट का उपयोग करें, सभी संभावित paths पर नहीं।

उदाहरण के लिए: नीचे एक if जाँच में दो समतुल्य likely चिह्नित किए गए हैं, इसका विशेष अर्थ नहीं।

if (value > 10) [[likely]] {
    // 主导路径:值大于 10
    std::cout << "Value is greater than 10: " << value << std::endl;
} else if (value > 5) [[likely]] {
    // 次主导路径:值大于 5 且小于等于 10
    std::cout << "Value is greater than 5 but less than or equal to 10: " << value << std::endl;
} else [[unlikely]] {
    // 较少出现的路径:值小于等于 5
    std::cout << "Value is 5 or less: " << value << std::endl;
}

2. उदाहरण

अंत में एक आम उदाहरण देते हैं, वह है vector का at, हम जानते हैं यह जाँचता है कि vector के size से आगे तो नहीं, ऐसी संभावना काफ़ी कम है, इसलिए हम unlikely का उपयोग कर सकते हैं, उदाहरण के लिए:

int& at(std::vector<int>& vec, std::size_t i) {
  if (i >= vec.size()) [[unlikely]] {
      throw std::out_of_range("Out of bounds access");
  }
  return vec[i];
}

संबंधित विषय

टिप्पणियाँ