2010-06-21 9 views
16

क्या सी 99 वीएलए का उपयोग करना अच्छा विचार है? मॉलोक/फ्री की तुलना में वीएलए का उपयोग करना कब उचित है? (VLA ढेर को उड़ाने सकता है, क्योंकि?)क्या मॉलोक/फ्री की तुलना में सी 99 वीएलए का उपयोग करना अच्छा विचार है?

+9

बचें अस्पष्टीकृत TLAs ... –

+17

@ थॉमस: शब्द "वीएलए" * * सी 99 के संदर्भ में एक अच्छी तरह से स्थापित, प्रसिद्ध अर्थ है। प्रश्न का उत्तर देने में कोई भी व्यक्ति यह जान लेगा कि इसका क्या अर्थ है। –

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/2034712/is-there-any-overhead-for-using-variable-length-arrays –

उत्तर

22

हां, उन मामलों को छोड़कर जहां आप जानते हैं कि आपका ढेर उड़ सकता है। यदि आवश्यक हो तो आप स्टैक के आकार को भी बदल सकते हैं, यह अलग-अलग ओएस पर अलग है लेकिन यह संभव है। VLA के लाभ हैं:

  • फास्ट: ढेर सूचक और/या फ्रेम सूचक का समायोजन वैसे भी होगा किया गया है तो एक VLA की लागत लगभग 0.

  • आसान है: एक साधारण परिभाषा, प्रारंभ करने के लिए कोई संकेतक, मुफ्त में जांचने और स्मृति रिसाव का कोई जोखिम नहीं।

  • यह स्वचालित रूप से थ्रेड सुरक्षित है क्योंकि प्रत्येक धागे का अपना ढेर होता है। यह भी बेहतर स्केलिंग है क्योंकि लॉकिंग की कोई आवश्यकता नहीं है, एक समस्या जो malloc/free का उपयोग करते समय उत्पन्न हो सकती है।

  • पठनीय: यह वास्तव में एक साधारण अवधारणा है, सूक्ष्म बग पेश करने की संभावना कम है।

यह कुछ कमियां भी हैं:

  • आकार सीमित: के रूप में पहले ही कहा, ढेर को उड़ाने कर सकते हैं।

  • बफर ओवरफ्लो ढेर मेमोरी की तुलना में थोड़ा अधिक गंभीर हैं (कोई तर्क दे सकता है कि यह एक लाभ है, क्योंकि एक क्रैशिंग एप्लिकेशन एक चुपचाप भ्रष्ट डेटा से बेहतर है और अंततः असंबद्ध निर्देशों पर क्रैश हो रहा है)।

  • पोर्टेबिलिटी: नहीं सभी compilers इसे लागू, लेकिन अक्सर यह (अर्थ थोड़ा अलग लेकिन कुछ भी वास्तव में गंभीर है ध्यान) alloca से प्रेरित किया जा सकता है।

+1

यदि आप उपयोग का अनुकरण करते हैं 'alloca()' (+1) आप 'sizeof' का उपयोग नहीं कर सकते, जिसे अक्सर मैक्रोज़ के अंदर छिपाया जाता है। –

3

ढेर आवंटन के साथ प्राथमिक लाभ यह है कि आप आवंटित चर लंबाई सरणी के स्वचालित स्मृति प्रबंधन मिलता है। चूंकि स्मृति प्रबंधन किसी भी सी प्रोग्राम के लिए मुख्य चुनौतियों में से एक है, इसलिए आप निश्चित रूप से अपने कार्य को सरल बनाने के लिए वीएलए का उपयोग करना चाहिए, यदि आप कर सकते हैं।

मैं तो वकालत करेगा कि आप VLA के consistenly जब आप कर सकते हैं का उपयोग करना चाहिए, और नहीं तो malloc का प्रयोग तभी करें: आप भंडारण की अवधि को नियंत्रित करने की जरूरत है, और यदि आप बहुत बड़े आवंटन है, और आप बाहर संभाल करना चाहते हैं मेमोरी त्रुटियों की गलती से।

+0

कितना बड़ा 'बहुत बड़ा' \ o/ –

0

C99 से संबंधित लिंक (चर लंबाई सरणियों के बारे में जानकारी के लिए लिंक शामिल हैं) का एक अच्छा सूची के लिए देखें:

Xcode अब चूक C99 उपयोग करने के लिए - तो C99 क्या है?

http://lists.apple.com/archives/xcode-users/2008/May/msg00665.html

1

सी ++ Vlas समर्थन नहीं करता। इसलिए सी ++ को कोड पोर्ट करने के लिए यह थोड़ा और प्रयास होगा, आवश्यकता की आवश्यकता होनी चाहिए।

फिर, कुछ मानते हैं कि यह वास्तव में एक अच्छी बात है और चालाकी से "वर्ग" इस तरह के Vlas के रूप में सी में एक प्रतीक के लिए एक अद्भुत नाम के रूप में प्रस्ताव :-)

+2

'कुछ का मानना ​​है कि यह वास्तव में एक अच्छी बात है और चालाकी से "वर्ग" को प्रतीक में एक प्रतीक के लिए एक अद्भुत नाम के रूप में प्रस्तावित करता है :-)': ठीक है, जब कोई बेहतर नहीं हो सकता है, तो जीतने का सबसे अच्छा तरीका है छेड़छाड़ करने का प्रयास करना प्रतियोगिता... – paercebal

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

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