2010-11-02 9 views
8

मैं दो प्रश्न हैं:क्या कोई आवंटक है जो एलोका का उपयोग करता है और अन्यथा सी ++ एसटीएल अनुपालन करता है?

1) यह एक संभाजक ढेर पर स्मृति को आबंटित करने alloca का उपयोग करता है और नहीं तो सी ++ एसटीएल अनुपालन करता है लागू करने के लिए संभव है?

यदि वहां कोड है, तो आप मुझे URL पर इंगित करके मुझे खुश कर सकते हैं। :-) यदि वहां कोई कोड नहीं है, तो शायद आप आवंटित कार्यों को रद्द कर सकते हैं और हटा सकते हैं?

2) यदि उपरोक्त प्रश्न का उत्तर 'हां' है, तो मैं समझना चाहता हूं कि वर्ग के सदस्यों के लिए ढेर पर स्मृति आवंटित करना संभव है। उदाहरण के लिए, एक

std::vector<int, AllocaAllocator<int> > 

पर विचार करने और लगता है कि सदस्य समारोह के एक कॉल 'का आकार परिवर्तन' की इस सदिश कॉल पहले 'पुनःआवंटन' और फिर संभाजक की 'आवंटित'।

जिस आवंटन को आवंटित किया जाता है वह सदस्य कार्य का आकार बदलता है। इसका मतलब यह नहीं है कि आवंटित स्मृति उस फ़ंक्शन कॉल के अंत में स्टैक से हटा दी जाती है?

सधन्यवाद, जोएर्न

+3

आप ऑलोकै के माध्यम से स्टैक पर आवंटित स्थान को स्थानांतरित नहीं कर सकते हैं। एलोका द्वारा आवंटित स्मृति प्राप्त करने का एकमात्र तरीका फ़ंक्शन से बाहर निकलना है। – Patrick

+0

क्या इसका मतलब यह है कि, यदि आप किसी फ़ंक्शन से बाहर निकलते हैं, तो उस कार्य के भीतर आवंटित सभी स्मृति आवंटन के माध्यम से ढेर पर मुक्त हो जाती है? और क्या इसका मतलब यह है कि कक्षा के सदस्यों के लिए स्मृति आवंटित करने के लिए एलोका का उपयोग करना असंभव है? इस प्रकार, क्या आवंटन लिखना असंभव है जो एलोका का उपयोग करता है? – Bjoern

+2

कृपया इस प्रश्न पर एक नज़र डालें: "सी ++ एसटीएल की तरह वेक्टर क्लास की तलाश है लेकिन स्टैक स्टोरेज का उपयोग करना" (http://stackoverflow.com/q/354442) उस विषय पर पहले से ही कुछ मूल्यवान टिप्पणियां हैं। –

उत्तर

5

जोएर्न, ऐसा लगता है कि आप मूल रूप से गलत कैसे ढेर और alloca काम करते हैं। उनके बारे में पढ़ें।

आप क्या कह रहे हैं असंभव है क्योंकि स्मृति alloca द्वारा आवंटित "मुक्त कर दिया" जाता है जब आप समारोह है कि यह आवंटित (और पैट्रिक के विपरीत कहा, इनलाइन करने नहीं कर सकते हैं परिवर्तन अपने व्यवहार) से लौटने है। मैं "मुक्त" लिखता हूं क्योंकि यह वास्तव में मुक्त नहीं होता है, यह किसी भी अन्य ढेर चर के रूप में गुंजाइश से बाहर चला जाता है। तो इसके बाद इसका उपयोग अपरिभाषित व्यवहार का कारण बनता है।

आप YourAllocator::allocate में स्मृति का एक हिस्सा है जो d.push_back() से कहा जाता है का आवंटन मान लीजिए:

deque<int, AllocaAllocator> d; 
d.push_back(42); // calls alloca 
printf("Hello\n"); 
printf("%d\n", d[0]); 

स्मृति alloca द्वारा आवंटित push_back और printf के ढेर फ्रेम द्वारा अधिलेखित हो सकता है, तो उत्पादन नहीं किया जा सकता 42, यह दुर्घटनाग्रस्त हो सकता है, या किसी भी अन्य चीज।

3

नहीं, इस तरह की चीज संभव नहीं है। शुरुआत के लिए, एसटीएल अधिक स्मृति आवंटित करने की अपेक्षा करता है, फिर पुरानी याददाश्त मुक्त करें। आप ढेर पर ऐसा करने जा रहे हैं?

एकमात्र चीज भी इसके समतुल्य रूप से समकक्ष है जो एक रूढ़िवादी कचरा कलेक्टर है।

+0

+1 "एसटीएल के लिए अधिक स्मृति आवंटित करने की उम्मीद है, * फिर * पुरानी याददाश्त मुक्त करें। आप इसे ढेर पर कैसे कर रहे हैं?" –