मैं समझता हूं कि .reserve() वास्तव में इसके आकार को संशोधित किए बिना वेक्टर के लिए मेमोरी सुरक्षित रखता है। लेकिन इसे कैसे लागू किया जाता है? आप इसे आवंटित किए बिना स्मृति को कैसे आरक्षित कर सकते हैं?

संपादित करें: मैं विशेष रूप से इस बारे में पूछ रहा हूं कि स्मृति को आवंटित किए बिना कैसे आरक्षित किया जाए, इस बारे में नहीं कि std::vector सामान्य रूप से कैसे काम करता है

1
H-005 13 फरवरी 2021, 18:28

3 जवाब

सबसे बढ़िया उत्तर

vector::reserve स्मृति आवंटित करता है, इसलिए आवंटित किए बिना स्मृति आरक्षित करने के बारे में आपका प्रश्न गलत है। मुद्दा यह है कि वैक्टर के आकार को बदले बिना मेमोरी को आरक्षित किया जा सकता है। मूल रूप से एक वेक्टर के दो आकार होते हैं, इसका आकार और इसकी क्षमता। reserve मेमोरी आवंटित करता है और क्षमता बदलता है, लेकिन आकार नहीं।

किसी भी समय निम्नलिखित सत्य है 0 <= size <= capacity। क्षमता आवंटित स्मृति की मात्रा को दर्शाती है, आकार उस स्मृति में निर्मित तत्वों की संख्या को दर्शाता है।

4
john 13 फरवरी 2021, 18:45

आपने एक मुख्य बात को गलत समझा: std::vector::reserve वास्तव में स्मृति आवंटित करता है।

मान लें कि हम एक कस्टम Allocator बनाते हैं जैसे:

template <typename T>
struct Allocator
{
    using value_type = T;

    Allocator() = default;
 
    T* allocate( std::size_t N )
    {
        N *= sizeof( T );
        std::cout << "Allocation " << N << " bytes" << std::endl;
        return static_cast< T* >( ::operator new( N ) );
    }
 
    void deallocate( T *ptr, std::size_t N ) 
    {
        std::cout << "Deallocation " << (N * sizeof * ptr) << " bytes" << std::endl;
        ::operator delete( ptr );
    }
};

यदि आप इसका उपयोग करते हैं जैसे:

int main()
{
    std::vector< int, Allocator< int > > v;
    v.reserve( 100 );
}

आउटपुट होगा:

Allocation 400 bytes
Deallocation 400 bytes

आप इसे यहां

2
NutCracker 13 फरवरी 2021, 18:48

किसी सदिश का आकार उसके पास मौजूद तत्वों की संख्या है। किसी सदिश की क्षमता उन तत्वों की संख्या है, जिन्हें वह अतिरिक्त स्मृति आवंटित किए बिना धारण कर सकता है। reserve तत्वों को फिर से आवंटित और कॉपी करके क्षमता बढ़ा सकते हैं। यह क्षमता बढ़ाता है लेकिन आकार नहीं बदलता है।

1
Pete Becker 13 फरवरी 2021, 18:48