2009-03-22 13 views
5

सी में गतिशील तार बनाने के विभिन्न तरीके हैं (लंबाई जो लगातार बदलती है)। कुछ Google खोज के बाद, ऐसा करने का मुख्य तरीका realloc() का उपयोग करना है।सी गतिशील स्ट्रिंग लंबाई

जिस तरह से मैंने इसे कार्यान्वित किया है, वह प्रत्येक नोड के लिए 32 बाइट्स भाग के साथ लिंक्ड सूचियों का उपयोग कर रहा है।

मैं सोच रहा था कि realloc() और लिंक्ड सूचियों का उपयोग करने से अलग करने के बेहतर तरीके हैं और प्रत्येक विधि के लिए विपक्ष और पेशेवर क्या हैं।

संपादित कारण मैं यह कर रहा हूँ क्योंकि मैं (एक सॉकेट recv से गतिशील डेटा प्राप्त कर रहा हूँ), और यह भंडारण का एक सुविधाजनक तरीका ढूंढ रहा था, कि नहीं कर रहे डेटा की भारी मात्रा का आवंटन बिना ' टी की जरूरत नहीं है।

+0

यदि आप पोस्ट करते हैं तो आप यह क्यों करेंगे यदि आप ऐसा क्यों कर रहे हैं। आपने अनिवार्य रूप से एक मिनी-मेमोरी मैनेजर लिखा है और मैं देख सकता हूं कि आपको इससे कोई फायदा नहीं होगा (केवल समस्याएं) – JaredPar

+0

ठीक है, मैंने कारण जोड़ा। लोगों को समझने के लिए यह एक दिलचस्प विषय भी है, बहुत खराब है इसे कम किया जा रहा है। –

+0

कारण यह दिलचस्प है, कारण के बिना यह अजीब था .... – Johan

उत्तर

3

आप विभिन्न पूर्वनिर्धारित आकारों को फिर से चला सकते हैं। उदाहरण के लिए, जब बफर भरा होता है, तो इसका आकार दोगुना हो जाता है।

एक लिंक्ड सूची का उपयोग करना एक अच्छा विचार है, लेकिन डेटा निरंतर नहीं है (उदाहरण के लिए आप पूरी संरचना printf पर नहीं पारित कर सकते हैं) और अनुक्रमण में अधिक गणनाएं (ओ (एन)) लेती हैं। एक बड़ा फायदा यह है कि तारों को जोड़ना (किसी भी अंत में) ओ (1) है।

2

मुझे लगता है कि आप Scatter-Gather I/O के लिए देख रहे हैं, तो आप जिस फ़ंक्शन को देखना चाहते हैं वह readv() होगा।

1

यदि आप रीलोक() का उपयोग करते हैं, तो प्रत्येक रीलोक पर निरंतर मात्रा में जगह न जोड़ें, क्योंकि लम्बाई एन की स्ट्रिंग बनाने की लागत ओ (एन^2) होगी (रीलोक शायद आवंटित होगी एक नया क्षेत्र और वहां डेटा कॉपी करें, यानी इसकी जटिलता स्थिर नहीं है लेकिन ओ (एन))। ऐसा करने का सबसे आसान तरीका हर रीलोक पर बफर के आकार को दोगुना करना है, फिर अमूर्त लागत अभी भी ओ (एन) होगी।

+0

Realloc स्मृति पृष्ठों का लाभ ले सकता है। यदि कोई पृष्ठ 8k है, और एक स्ट्रिंग 17k है, तो 16k दो 8k पृष्ठों में हो सकता है और दूसरा 1k चारों ओर स्थानांतरित हो सकता है। हालांकि, यह उससे अधिक जटिल है। – strager

1

32 बाइट भागों का उपयोग करना मतलब है कि डेटा और ओवरहेड के बीच का अनुपात भयानक है - आपके पास लिंकर सूची में आपका पॉइंटर है और कम से कम (शायद अधिक) स्मृति आवंटक से वही है। मैं दृढ़ता से स्मृति के एक बड़े हिस्से को आवंटित करने का सुझाव देता हूं और इसे उपयुक्त रूप से फिट करने के लिए बढ़ता हूं और देखता हूं कि इससे समस्याएं आती हैं या नहीं। केवल अगर आपको समस्याएं आती हैं तो मैं लिंक किए गए सूची मार्ग पर जाऊंगा।

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