मेरे पास निम्न कोड है:

#include <random>
#include <vector>
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
const int N=100000;
int main() {

    default_random_engine Generator(time(0));
    uniform_real_distribution<float> dist(0.0f,nextafter(1.0f, DBL_MAX));

    array<float,N> a{0};
    //vector<float> a(N,0);



    for ( auto it = a.begin(); it != a.end(); ++it ){
        *it=dist(Generator);
    }

    return 0;
}

मेरे पास अस्पष्टता यह है कि एन 100000 होने पर सरणी उत्पन्न की जा सकती है लेकिन जब एन 1 मिलियन हो जाता है, तो यह तुरंत शून्य के निकास मूल्य के साथ प्रोग्राम से बाहर निकलता है! दूसरे शब्द में, यह दुर्घटनाग्रस्त हो जाता है। लेकिन, जब मैं एक सरणी के बजाय वेक्टर का उपयोग करता हूं, तो लाखों तत्व भी इस तरह से उत्पन्न किए जा सकते हैं। क्या कोई इसे समझा सकता है? क्या बड़े आकार की संख्याएँ उत्पन्न करने के लिए सरणी में किसी प्रकार की सीमा है?

0
MA19 13 फरवरी 2021, 23:03

2 जवाब

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

क्योंकि arrayअपनी मेमोरी को स्टैक पर आवंटित करता है, जबकि vector हीप पर मेमोरी आवंटित करता है। आप array को ढेर पर भी आवंटित कर सकते हैं, new के साथ या shared_ptr या unique_ptr इस तरह:

shared_ptr<array<float,N>> a(new array<float,N>{0});
float v = (*a)[10]; // dereference for operator access
2
lopho 15 फरवरी 2021, 00:24

ऐसा इसलिए है क्योंकि आपके द्वारा ऐरे के साथ आवंटित मेमोरी स्टैक पर है और आपका प्रोग्राम स्टैक इतना बड़ा नहीं है कि आपको एक स्टैक ओवरफ़्लो। हालांकि, जब आप वेक्टर का उपयोग करते हैं, तो आप ढेर पर स्मृति आवंटित करते हैं।

यदि आप अभी भी std::array का उपयोग करना पसंद करते हैं, तो आप सरणी को ढेर पर रख सकते हैं: new std::array<float, N>(0)

2
Raymond Chen 13 फरवरी 2021, 23:11