विषय पर बढ़ें

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

C++20 [[no_unique_address]]

C++那些事 - मेमोरी ऑप्टिमाइज़ेशन

प्रायः प्रोग्राम चलते समय मेमोरी एक बड़ी समस्या होती है, मेमोरी उपयोग कम करना और access गति बढ़ाना अत्यंत महत्वपूर्ण है। इन समस्याओं के समाधान के लिए, C++20 ने no_unique_address विशेषता पेश की और empty base optimization (EBO, Empty Base Optimization) के साथ मिलकर, डेवलपर्स को मेमोरी layout ऑप्टिमाइज़ करने का प्रभावी तरीका दिया।

1. Empty Base Optimization (EBO)

EBO का अर्थ है कि empty बेस क्लास (यानी बिना डेटा मेंबर वाली क्लास) का डिराइव्ड क्लास में होना अतिरिक्त मेमोरी नहीं लेता। C++ कंपाइलर इन empty बेस क्लासों के इंस्टेंस को मिला देता है, जिससे अनावश्यक मेमोरी ख़र्च टलता है। यह जटिल क्लास पदानुक्रम डिज़ाइन करते समय विशेष रूप से उपयोगी है, और ऑब्जेक्ट का आकार प्रभावी रूप से कम किया जा सकता है।

#include <iostream>
class Empty {};

class Derived : public Empty {
  int value;

 public:
  Derived(int v) : value(v) {}
};

class Test {
  int value;

 public:
  Test(int v) : value(v) {}
  Empty e;
};

int main() {
  std::cout << sizeof(Derived) << std::endl;
  std::cout << sizeof(Test) << std::endl;
  return 0;
}

उपरोक्त कोड में, Derived क्लास मेमोरी में केवल int का आकार लेती है, int और Empty का आकार नहीं। इसका कारण यह है कि कंपाइलर ने EBO विशेषता का लाभ लिया।

तो अंदाज़ा लगाइए, ऊपर वाला आउटपुट कितना होगा?

2. no_unique_address विशेषता

C++20 ने no_unique_address विशेषता पेश की, जो हमें कुछ क्लास मेंबरों को स्पष्ट रूप से चिह्नित करने की अनुमति देती है, ताकि वे मेमोरी में अतिरिक्त स्थान न लें। यह <0 बाइट ऑब्जेक्ट> के लिए विशेष रूप से उपयुक्त है, उदाहरण के लिए:

unique_ptr में जब Deleter empty struct/क्लास हो, तब मिलने वाला sizeof 16 होता है, C++20 के बाद यह बाइट नहीं लेता और पूरा sizeof 8 हो जाता है।

template<class T, class Deleter>
class unique_ptr {
    T* pointer = nullptr;
    [[no_unique_address]] Deleter deleter;

   public:
    // 其他成员函数...
};

यह सेक्शन समाप्त

संबंधित विषय

टिप्पणियाँ