क्या मुझे अपने छात्रों को आवंटित करना सिखाना चाहिए? [बन्द है]


18

allocaवास्तविक दुनिया में कितना व्यापक रूप से उपयोग किया जाता है ? क्या मुझे अपने छात्रों को इसका उपयोग करना सिखाना चाहिए allocaजब यह समझ में आता है? या क्या मुझे यह सिखाना चाहिए कि इसका इस्तेमाल कभी न करें? C ++ RAII बैकग्राउंड से आने के बाद, freeमैन्युअल रूप से कॉल न करने का विचार आशाजनक लगता है, विशेष रूप से कई एक्ज़िट पॉइंट्स वाले फ़ंक्शंस में।



8
उन्हें C99 VLAs क्यों नहीं पढ़ाया जाता?

@cnicutar alloca () कार्यान्वयन-निर्भर है लेकिन कम से कम कई कार्यान्वयन विफलता पर NULL लौटाते हैं। C99 VLAs में विफलता को इंगित करने का कोई तरीका नहीं है।
जटिल

2
@ एसबीआई: एसओ के लिए यह एक ओपन-एंडेड प्रश्न है जो वास्तव में उस प्रारूप के अनुकूल नहीं है जो क्लोजर्स को लगता है कि एसओ पोस्ट होना चाहिए। यह बहुत व्यक्तिपरक है, कोई स्पष्ट जवाब नहीं है, केवल राय है। जो ठीक है लेकिन एसओ के लिए नहीं है। यह भी देखें कि ओपी के प्रतिनिधि के सम्मान के बाहर कोई भी वोटिंग नहीं कर रहा है, हम इस प्रश्न को विषय के रूप में बंद कर रहे हैं।
पॉल शशिक

1
@PascalCuoq आपको वैसे भी एलोका / वीएलए के साथ बहुत अधिक आवंटित नहीं किया जाना चाहिए। यदि अनिश्चित है कि "बहुत कुछ" वर्तमान संदर्भ में है, तो उपयोग करें malloc

जवाबों:


31

यदि आप सामान्य सी प्रोग्रामिंग में एक कोर्स कर रहे हैं, तो आपको उन्हें ऐसी चीज नहीं सिखानी चाहिए जो मानक में नहीं है। शुरुआती प्रोग्रामर अनावश्यक रूप से गैर-मानक और / या गैर-पोर्टेबल कोड लिख रहे हैं क्योंकि उन्हें उस तरह से पढ़ाया गया था, पिछले 20-30 वर्षों के दौरान सॉफ्टवेयर उद्योग के लिए एक बड़ी समस्या रही है। उन्हें मानक और कुछ भी नहीं सिखाने के लिए लागत, लेकिन मानक की संभावना खगोलीय है।

यदि आप एल्गोरिदम या एप्लिकेशन प्रोग्रामिंग में अधिक उन्नत पाठ्यक्रम धारण कर रहे हैं, तो इसका उल्लेख करना अच्छा हो सकता है। दूसरी ओर, मैंने उस फ़ंक्शन का उपयोग किए बिना हार्ड रियलटाइम एम्बेडेड ऐप्स से विंडोज एप्लिकेशन फ़्लफ़ के लिए 15 वर्षों तक सब कुछ प्रोग्राम किया है।


एकमात्र उपयोग जो मैंने देखा है जहां यह बेहतर नहीं होगा दूसरा तरीका विंडोज के कुछ संस्करणों पर स्टैक स्मैश का पता लगाना था, जहां एक विफलता ने इंगित किया कि अपर्याप्त स्थान छोड़ दिया गया है - या शायद यह दुर्घटना को पकड़ने के लिए केवल कुछ ASM था ; जब से मैंने उस कोड को देखा, कुछ समय हो चुका है। यह काम किया है, लेकिन थोड़ा डरावना था।
डोनाल्ड फेलो

13

मैं दो चीजें होते हुए देख सकता हूं:

  1. allocaस्टैक और हीप के बीच के अंतर के बारे में पढ़ते हैं, और allocaसावधानी से उपयोग करते हैं, छात्रों के प्रभाव को समझते हैं । (संभावना नहीं)

  2. छात्रों को लगता है "वाह, यह mallocचिंता किए बिना है free," इसे अत्यधिक उपयोग करें, स्टैक ओवरफ्लो प्राप्त करें, और पता नहीं है।

मुझे लगता है कि यदि आप वर्णन करते हैं तो यह बहुत बेहतर है alloca, तो इस कोड को चलाएं:

#include <malloc.h>

int OverflowMyStack(int start) {
    if (start == 0)
        return 0;

    char * p = (char *)_alloca(4096);
    *p = '0';
    return OverflowMyStack(start - 1);
}

int main () {
    return OverflowMyStack(512);
} 

स्रोत: http://www.strchr.com/alloca

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


1
मुझे लगता है कि अधिकांश छात्र अभी भी उदाहरण कोड दिखाने के बाद भी दूसरी श्रेणी में आते हैं।
राइटफोल्ड

@TP - शायद, लेकिन इसीलिए आप उन्हें बताएं कि जो हो सकता है उसे दिखाने के बाद भी इसका इस्तेमाल न करें।
ब्लैकजैक

4
उस कोड के _allocaबजाय उपयोग क्यों करता है alloca? और यह परिणाम क्यों डालता है?
कीथ थॉम्पसन

5

इस प्रश्न का उत्तर इस बात पर आधारित होना चाहिए कि आपके उद्देश्य क्या हैं

क्या आप किसी ऐसे व्यक्ति को पढ़ाना चाहते हैं जो पहले से ही जानता है कि सी को कैसे लिखना है और जंगल में मौजूदा सी कोड के साथ काम करना है? यदि हां, तो एलोका और कुछ और जो आप चाहते हैं, के बारे में बताएं।

दूसरी ओर, यदि आप एक परिचयात्मक पाठ्यक्रम सिखा रहे हैं, जो केवल संयोग से सी का उपयोग कर रहा है (और क्योंकि सी एक बहुत छोटी भाषा है और इसी तरह) आपको महत्वपूर्ण भागों (मॉड्यूलर प्रोग्राम, सबरूटीन्स, संग्रह, लेखन) पर ध्यान देना चाहिए ... ।)। एक छात्र के दृष्टिकोण से, एलोका एक बीर अतिरेक है क्योंकि ज्यादातर मामलों में मॉलॉक पर्याप्त है और एक अच्छे-कोड के परिप्रेक्ष्य से आप बेहतर तरीके से यह उल्लेख कर रहे हैं कि मैन्युअल मेमोरी प्रबंधन कैसे परेशान है और अन्य भाषाएं इस समस्या से कैसे निपटती हैं, आखिरकार, और भी बहुत कुछ है मेमोरी मैनेजमेंट की चीजें तो एलोका या आरएआईआई ताकि आप वास्तव में खुद को इन तक सीमित न रखें और जैसा कि आपने पहले ही उल्लेख किया है, एलोक का उद्देश्य समझने में बहुत आसान है यदि आप इसे अन्य भाषाओं में चीजों के लिए "अधिक मानक" तरीकों से तुलना करते हैं (या C99 ...)


2

नहीं।

केवल एक सी प्रोग्रामर को एलोके के अस्तित्व के बारे में पता होना चाहिए, इसका उपयोग उस विरासत कोड को समझना और ठीक करना है।

किसी भी तरह का उपयोग allocaहै

  1. बेकार, यानी यह तुच्छ रूप से स्वचालित भंडारण अवधि के निश्चित आकार के चर द्वारा प्रतिस्थापित किया जा सकता है, या
  2. एक खतरनाक स्टैक ओवरफ्लो होने की प्रतीक्षा कर रहा है।

कुछ विचार प्रयोगों के अलावा, जिनके लिए मुझे कभी कोई वास्तविक दुनिया के उदाहरण नहीं मिले हैं, alloca(या वीएलए) के लिए कोई उपयोग मामला नहीं है जो या तो बेकार या कमजोर नहीं है (उपरोक्त 2 मामलों में से एक)।


2
बेशक, कोई भी कभी भी संभवतः इसे जिम्मेदारी से उपयोग कर सकता है। नहीं कभी नहीं।
17-16 बजे डेडएमजी

केवल "जिम्मेदार" का उपयोग allocनिश्चित आकार के स्वचालित सरणियों के बराबर 100% है, और कम पोर्टेबल है।
आर .. गिटहब स्टॉप हेल्पिंग ICE

मुझे लगता है, फिर, कोई भी कभी भी कुछ गतिशील राशि आवंटित नहीं करना चाहता है, कहते हैं, कुछ किलोबाइट जो कभी भी अतिप्रवाह नहीं होगा। या कुछ OS API फ़ंक्शन को कॉल करें जो उन्हें बताएगा कि कितना उपलब्ध है। या बस स्टैक आकार को बहुत बढ़ाएं।
डेडएमजीन

यदि यह कुछ KB है और आप आश्वस्त हैं कि आपके पास कुछ KB हैं, तो आप बस T foo[5000];या जो भी उपयोग कर सकते हैं ।
आर .. गिटहब स्टॉप हेल्पिंग ICE

केवल अगर T में एक सामान्य डिफ़ॉल्ट कंस्ट्रक्टर है। अगर मैं प्रदर्शन-ज़रूरतमंद था, तो स्मृति की साधारण ज़ीरोइंग भी मुझे महंगी पड़ सकती है। लेकिन अन्य प्रकारों में और भी अधिक जटिल डिफ़ॉल्ट-निर्माण तर्क हो सकते हैं। यदि मैं उदाहरण के लिए, गतिशील रूप से एक सरणी बनाना चाहता हूं std::mutex, तो मैं पांच हज़ार mxxes के लिए कर्नेल कॉल और संदर्भ स्विच लागू कर सकता हूं। सस्ता नहीं। सरणी के बाद स्थानीय चर रखने की अतिरिक्त कैश लागत का उल्लेख नहीं करना।
डेडएमजी

1

मेरी राय इसका उपयोग करने के लिए प्रोत्साहित नहीं करती है जब तक कि आप स्थानीय चर के लिए स्टैक स्थान आवंटित करने के लिए उपयोग किए जाने वाले निम्न स्तर के संकलक सिद्धांत नहीं सिखा रहे हैं। इसे उस संदर्भ में पढ़ाएं।


0

जीसीसी प्रलेखन एक जोड़े को व्यावहारिक पेशेवरों और विपक्ष पर है alloca()। व्यावहारिक दृष्टिकोण से, मुफ्त सॉफ्टवेयर का एक सभ्य मात्रा में उपयोग करता है, इसलिए यह समझना अच्छा है कि यह कैसे काम करता है और मौजूदा कोड में इसका उपयोग कहां किया जाता है।

पासिंग -Wl,-stack=नए ढेर आकार जीसीसी बढ़ जाती है अधिकतम ढेर आकार करने के लिए; यदि आपकी परियोजना का उपयोग करता है alloca(), या बड़ी अस्थायी सरणियों का आवंटन करता है या एक निश्चित संदर्भ-निर्भर गहराई से पुनरावृत्ति का उपयोग करता है , तो आपको ऐसा करने की आवश्यकता होगी ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.