2010-04-10 8 views
7

क्याएलोका (एन) और चार एक्स [एन] के बीच क्या अंतर है?

void *bytes = alloca(size); 

और

char bytes[size]; //Or to be more precise, char x[size]; void *bytes = x; 

... जहां आकार एक चर जिसका मूल्य संकलन समय पर अज्ञात है है के बीच का अंतर है।

+1

उत्तर गंभीरता से निर्भर करता है कि 'आकार' संकलन-समय स्थिर है या नहीं। क्या यह? – AnT

+0

नहीं, आकार सभी उद्देश्यों और उद्देश्यों के लिए है, फ़ंक्शन –

+0

पर कोई तर्क नहीं है इससे कोई फर्क नहीं पड़ता। डिफ़ॉल्ट रूप से ऐप्पल '--std = gnu99' का उपयोग करता है जो दोनों का समर्थन करता है। 'alloca()' एक जीएनयू एक्सटेंशन है, और चर लंबाई लंबाई सरणी मानकों-अनुरूप सी 99 सुविधा है। –

उत्तर

13

alloca() वर्तमान फ़ंक्शन समाप्त होने तक स्मृति को पुनः प्राप्त नहीं करता है, जबकि परिवर्तनीय लंबाई सरणी वर्तमान ब्लॉक समाप्त होने पर स्मृति को पुनः प्राप्त करती है। , किसी भी C89 संकलक पर

void foo() 
{ 
    size_t size = 42; 
    if (size) { 
     void *bytes1 = alloca(size); 
     char bytes2[size]; 
    } // bytes2 is deallocated here 
}; //bytes1 is deallocated here 

alloca() समर्थन किया जा सकता है (एक फैशन में), जबकि चर लंबाई सरणी एक C99 संकलक की आवश्यकता है:

दूसरे शब्दों में।

+2

@ बिली: चार बाइट्स [आकार] द्वारा आवंटित स्मृति को मौजूदा ब्लॉक के अंत में शारीरिक रूप से पुनः दावा करने की गारंटी नहीं है; हालांकि वर्तमान ब्लॉक के बाद पहुंच अब संभव नहीं है। – Vlad

+0

वह कंपाइलर क्या करता है? –

+2

@Vlad: तकनीकी रूप से सी मानक एक विशेष वास्तुकला पर किसी भी संभावित निर्भरता से बचने के लिए वास्तव में भौतिक रूप से संग्रहीत होने की आवश्यकता के बारे में बहुत कम उल्लेख करता है। हालांकि, यहां तक ​​कि अगर कुछ मानक में स्पष्ट रूप से नहीं है, तो मानक परिणामों में अंतर्निहित अर्थ 99.9% कंपाइलर्स इस तरह कार्यान्वित करते हैं। –

0

दूसरे रूप में, size को संकलित समय के लिए लगातार जाना जाना चाहिए।

+3

सी 99 में नहीं। (15chars) –

+0

@ बिली: दरअसल। – Vlad

+0

संभावित रूप से, लेकिन यह अधिक संभावना है कि ओपी चरम लंबाई सरणी का संदर्भ दे रहा है, सी 99 मानक का हिस्सा है। – rjh

6

GNU documentation से:

अंतरिक्ष alloca साथ आवंटित युक्त समारोह रिटर्न जब तक मौजूद है। एक चर-लंबाई सरणी के लिए स्थान को सरणी नाम स्कोप समाप्त होने के तुरंत बाद हटा दिया जाता है। (आप एक ही समारोह में दोनों चर लंबाई सरणियों और alloca उपयोग करते हैं, एक चर लंबाई सरणी का आवंटन रद्द करने को भी कुछ भी अधिक हाल ही में alloca साथ आवंटित पुनःआवंटन जाएगा।)

साथ ही, alloca एक मानक सी समारोह नहीं है, इसलिए सभी कंपाइलरों में समर्थन की गारंटी नहीं है। परिवर्तनीय लंबाई सरणी सी 99 मानक का हिस्सा हैं, इसलिए किसी भी सी 99-सहायक कंपाइलर को इसे लागू करना चाहिए।

+0

भले ही यह आपके कंपाइलर द्वारा समर्थित न हो, फिर भी 'alloca' के सार्वजनिक डोमेन संस्करण उपलब्ध हैं। –

+0

ध्यान दें कि alloca() को POSIX.1-2001 में निर्दिष्ट किया गया है – martinkunev

5

बिली के बिंदु के अलावा, alloca गैर-मानक है (यह सी 99 में भी नहीं है)।

0

जब वास्तव में अंतरिक्ष मुक्त हो जाता है की पहले से ही चर्चा अंक इसके अलावा, और निर्माण में सभी समर्थित है या नहीं, वहाँ भी यह है:

  • alloca मामले में, bytes एक सूचक प्रकार है।
  • [] मामले में, bytes में एक सरणी प्रकार है।

सबसे उल्लेखनीय अंतर sizeof(bytes) में है; एक सूचक के लिए यह सूचक का आकार है (sizeof(void *)) जबकि एक सरणी के लिए आवंटित स्थान (sizeof(char) * size, जो = 1) के बाद से इस मामले के लिए = size का आकार है।

(इसके अलावा, अपने उदाहरण में, तत्व प्रकार भिन्न हैं;। एक ही हो सकता है, पहले char *bytes = alloca(size) को बदला जाना चाहिए)

0

सबसे बड़ा अंतर यह है कि alloca कंस्ट्रक्टर्स या विनाशकर्ता फोन नहीं होती जब आप कर रहे हैं कक्षा चर के रूप में स्मृति का उपयोग कर।

अन्य मतभेदों को ध्यान में रखने की संभावना कम है, लेकिन कुछ परिस्थितियों में कुछ अजीब रन टाइम त्रुटियों में स्पष्ट हो सकता है।