2010-04-09 17 views
7

मैं सी ++ के लिए अपेक्षाकृत नया हूँ, और शुरू से ही यह मेरे में drilled गया है कि आप इसके बजायसी ++ वैरिएबल लम्बाई सरणी क्यों देता है जो गतिशील रूप से आवंटित नहीं होते हैं?

int x; 
cin >> x; 
int array[x]; 

की तरह कुछ नहीं कर सकते, तो आप गतिशील स्मृति उपयोग करना चाहिए। हालांकि, मुझे हाल ही में पता चला है कि उपर्युक्त संकलित होगा (हालांकि मुझे एक एपैडेंटिक चेतावनी मिल रही है कि यह आईएसओ सी ++ द्वारा प्रतिबंधित है)। मुझे पता है कि यह मानक रूप से अनुमति नहीं है, तो यह स्पष्ट रूप से एक बुरा विचार है, लेकिन मुझे पहले यह भी पता नहीं था कि यह संभव था।

मेरा प्रश्न है, जी ++ वैरिएबल लम्बाई सरणी क्यों देता है जो मानक द्वारा अनुमत नहीं होने पर गतिशील रूप से आवंटित नहीं होते हैं? साथ ही, यदि संकलक के लिए यह संभव है, तो मानक में क्यों नहीं है?

+3

अपने अंतिम प्रश्न के बारे में, सी ++ उनका समर्थन क्यों नहीं करता है, आप इस प्रश्न से भी परामर्श ले सकते हैं: http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c और comp.lang। स्वीकृत उत्तर में सी ++ धागा जुड़ा हुआ है। –

उत्तर

19

चरम लंबाई सरणी (वीएलए) के लिए समर्थन सी 99 में सी भाषा में जोड़ा गया था।

ऐसा लगता है कि उनके लिए समर्थन जीसीसी (सी 99 का समर्थन करने के लिए) में मौजूद है, इसलिए यह उनके लिए g ++ में समर्थन जोड़ने के लिए अपेक्षाकृत सरल था।

यह कहा गया है कि यह एक कार्यान्वयन-विशिष्ट भाषा विस्तार है, और यदि आप अपना कोड पोर्टेबल होना चाहते हैं तो कार्यान्वयन-विशिष्ट एक्सटेंशन का उपयोग करना अच्छा नहीं है।

+1

मुझे पता नहीं था कि यह सी मानक में था। यह अच्छी तरह से बताता है, धन्यवाद! – Maulrus

+2

@ मौलरस: ध्यान रखें कि सी मानक में था, यह सी ++ मानक से पूरी तरह से अलग है। –

5

क्योंकि यह C99 में समर्थित है। मैं वास्तव में बात नहीं कर सकता कि यह सी ++ मानक में क्यों नहीं है। हालांकि, यह उतना उपयोगी नहीं है जितना आप सोच सकते हैं क्योंकि ओवरफ्लो ढेर करने के लिए यह आसानी से बढ़ता है (यदि आप सावधान नहीं हैं) (क्योंकि यह आम तौर पर alloca पर आधारित होता है, स्वयं ही गैर-मानक)। एक और गलती एक सूचक को गतिशील सरणी में वापस करना है, जो तुरंत दायरे से बाहर हो जाएगी।

+0

तो सी 99 में गतिशील रूप से आवंटित सरणी से चिपकना बेहतर होगा, भले ही यह मानक में हो? – Maulrus

+4

@ मौलरस उपयोगकर्ता इनपुट के आधार पर आयामों के साथ वीएलए का कभी भी उपयोग नहीं करते हैं। हालांकि, वही आवंटित सरणी के लिए भी यही सच है। आपको उपयोगकर्ता इनपुट को किसी भी तरह से मान्य करना होगा। तो मुझे यहां वीएलए के लिए विशिष्ट समस्या नहीं दिखाई दे रही है। यहां मेरा मोटा दिशानिर्देश है: यदि डेटा-सेट छोटा है, तो एक छोटे से स्थिर आकार के सरणी का उपयोग करें और एक int कहें कि कितने तत्वों का उपयोग किया जाता है। और यदि डेटा सेट बड़ा है, तो ढेर का उपयोग करें। मुझे वीएलए के लिए उपयोग-केस नहीं दिख रहा है, हालांकि। –

+1

यह शायद 1 99 5 सी ++ मानक में नहीं था क्योंकि इससे चर-लंबाई सरणी के सी 99 मानकीकरण से पहले था। यह संभवतः आने वाले मानक में नहीं है क्योंकि 'वेक्टर <>' समान कार्यक्षमता प्रदान करता है। –

3

लोट के कंपाइलर्स मानकों को गले लगाते हैं और बढ़ाते हैं। दो बुनियादी कारण हैं:

  1. घृणास्पद कंपाइलर-लेखक शायद सोचते हैं कि उनके कंपाइलर से दूर जाने में कठिन बनाना लंबे समय तक बढ़ने में मदद करता है।
  2. लाभकारी कंपाइलर-लेखक शायद सोचते हैं कि आपको अधिक विकल्प देने पर उन्हें कम लागत नहीं मिल सकती है, यह एक अच्छी बात है।
1

सी में होने के साथ उनके साथ होने वाले सभी कारण सही हैं, हालांकि आवश्यकता के लिए सीमाएं हैं। उदाहरण के लिए आप सी में आवश्यक चीज़ों की तुलना में अधिक लचीला समर्थन प्रदर्शित कर सकते हैं (यदि आपने सिंक के बजाए स्कैनफ़ का उपयोग करके कार्यान्वित किया है, इसे एक .c फ़ाइल में रखा है, और जीसीसी का उपयोग किया है)।

यह लगभग एलोका (ऑटो आवंटित) के लिए केवल एक निहित कॉल है जो केवल स्टैक पॉइंटर (स्टैक आकार में वृद्धि) को कम करता है और नए स्टैक पॉइंटर को दूसरे रजिस्टर में कॉपी करता है जिसे आवंटित स्मृति में पॉइंटर के रूप में उपयोग किया जाता है।

अंतर यह है कि रचनाकारों और विनाशकों को एलोका के साथ बनाई गई वस्तुओं पर नहीं बुलाया जा रहा है।

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