2016-02-01 7 views
7

जब मैं अपने Devcpp में इस कोड को चलाने compiler->अधिकतम आकार से संबंधित एक सरणी और वेक्टर के बीच अंतर?

#include<bits/stdc++.h> 
using namespace std; 
int main() 
{ 
    vector<int> vec; 
    for(int i=0;i<100000000;i++) 
    vec.push_back(i); 
} 

यह भी रन टाइम पर काम करता है। लेकिन जब मैं रन>

#include<bits/stdc++.h> 
using namespace std; 
int arr[1000000000]; 
int main() 
{ 
    return 0; 
} 

यह मेरे लिंक त्रुटि देता है।

जब तक अंतरिक्ष की आवश्यकता होती है तब तक एआर और वीसी दोनों को एक ही स्थान की आवश्यकता होती है। फिर यह क्यों है कि वीसी कोड रन टाइम पर भी ठीक चलता है लेकिन एआर कोड संकलित भी नहीं करता है।

+0

@dvenkatsagar no, यह समझ में नहीं आता है। –

+0

@dvenkatsagar यह समझ में नहीं आता है। – erip

+0

@ मार्कसमुलर जिनक्स। तुमने मुझे सोडा देना है। :) – erip

उत्तर

9

समस्या आवंटन के साथ है। पहले मामले में, std::vector डिफ़ॉल्ट allocator गतिशील आवंटन का उपयोग करता है, जो सिद्धांत रूप में जितना चाहें उतना स्मृति आवंटित कर सकता है (ओएस द्वारा निश्चित रूप से बाध्य और भौतिक स्मृति की मात्रा) जबकि दूसरे मामले में यह स्थिर आवंटन के लिए उपलब्ध स्मृति का उपयोग करता है (तकनीकी रूप से सरणी में static storage duration) है, जो आपके मामले में 1000000000 * sizeof int बाइट से छोटा है। सी प्रोग्राम में विभिन्न प्रकार के आवंटन (जो सी ++ के लिए भी लागू होता है) के बारे में एक अच्छा जवाब के लिए this देखें।

बीटीडब्ल्यू, #include<bits/stdc++.h> से बचें, क्योंकि यह गैर-मानक है। आपको केवल मानक हेडर की आवश्यकता है। एक और मुद्दा: मुझे नहीं लगता कि आपको संकलन-समय त्रुटि मिलती है, आपको शायद रन-टाइम त्रुटि मिलती है। दूसरे शब्दों में, कोड ठीक से संकलित करता है, लेकिन चलाने में विफल रहता है।

+0

हालांकि, संकलन त्रुटि की व्याख्या नहीं होगी। –

+0

@StevenBurnap मुझे यकीन नहीं है कि ओपी को संकलन त्रुटि मिल रही है, हालांकि यह शायद रन टाइम त्रुटि है। जवाब संपादित करेंगे। – vsoftco

+0

हाँ, यदि आप ओपी रनटाइम त्रुटि प्राप्त करते हैं, तो आप जो कहते हैं वह सही समझ में आता है। –

3

ऐसा लगता है कि वस्तु

int arr[1000000000]; 

अपने परिवेश के लिए अपने कार्यक्रम के वैश्विक डेटा में फिट करने के लिए बहुत बड़ी है। मुझे संकलन समय त्रुटि नहीं मिलती है लेकिन मुझे अपने पर्यावरण में एक लिंक टाइम त्रुटि भी मिलती है (साइगविन/जी ++ 4.9.3)।

मेरे लिए दसवें काम के आकार को कम करना। यह आपके लिए भी काम कर सकता है। मुझे नहीं पता कि आप वैश्विक डेटा में फिट होने वाली वस्तुओं के अधिकतम आकार को कैसे निर्धारित कर सकते हैं।

ढेर में उपलब्ध स्थान आकार में सबसे छोटा है।
वैश्विक डेटा में उपलब्ध स्थान वह बड़ा है।
ढेर में उपलब्ध स्थान सबसे बड़ा है।

यदि आपकी वस्तु ढेर में फिट होने के लिए बहुत बड़ी है, तो वैश्विक डेटा में डालने का प्रयास करें।
यदि आपका ऑब्जेक्ट वैश्विक डेटा में फिट होने के लिए बहुत बड़ा है, तो ढेर का उपयोग करें।

+0

'int arr [1000000000]; 'एक वस्तु है? वास्तव में? – StahlRat

+1

@StahlRat, सी ++ ऑब्जेक्ट मॉडल में, प्रत्येक चर एक वस्तु है। –

+1

सी ++ मानक नामों का अनुलग्नक बी 262144 अधिकतम ऑब्जेक्ट आकार के लिए दिशानिर्देश के रूप में। अगर मैं सही ढंग से समझता हूं, तो इसका मतलब है कि एक गैर गतिशील 'int' सरणी के लिए,' 262144/आकार (int) 'तत्वों तक कुछ भी गुणवत्ता कार्यान्वयन के साथ ठीक होना चाहिए। लेकिन निश्चित रूप से, * "ये मात्रा केवल दिशानिर्देश हैं और अनुपालन निर्धारित नहीं करते हैं" *। –

संबंधित मुद्दे