अंतिम अद्यतन: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.
यानी: किसी भी एट्रिब्यूट का अत्यधिक उपयोग परफ़ॉर्मेंस गिरावट ला सकता है।
तो किन स्थितियों में ये उपयोगी हैं, और किन स्थितियों में ज़रूरत नहीं?
इस लेख में अपने विचार रखता हूँ।
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 से चिह्नित किया जा सकता है।
- प्रधान 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];
}
संबंधित विषय¶
- C++20 coroutines परिचय | C++那些事
- C++20 channel व्यवहारिक उपयोग | C++那些事
- C++20 Concepts अवधारणा | C++那些事
- C++20 constexpr और comma एक्सप्रेशन | C++那些事
- C++20 byte order endian | C++那些事
- C++20 Lambda एक्सप्रेशन (भाग 1) | C++那些事
- C++20 Modules मॉड्यूल | C++那些事
- C++20 Ranges लाइब्रेरी | C++那些事
- C++20 std::span डिज़ाइन और जाल | C++那些事
- C++20 नई विशेषताओं की जानकारी | C++那些事