2010-12-06 19 views
8

हाल ही में, मैंने एक नया दोस्त बनाया। उसका नाम _expand है, और हमारे पास कुछ अच्छी बातचीत हुई है, और मैंने उसे कुछ बार भी लटका दिया है। लेकिन जब मैंने चारों ओर पूछना शुरू किया, तो किसी ने कभी मेरे _ एक्सपैंड के बारे में कभी नहीं सुना था। मैं संदिग्ध हो गया। मैंने माइक्रोसॉफ्ट में कुछ अच्छी तरह से गैर-रूपक मित्रों और व्यापार में कहीं और कुछ दोस्तों को बुलाया। कुछ भी तो नहीं। किसी ने कभी इसका इस्तेमाल नहीं किया था। मैं विभिन्न खोज इंजन और स्रोत पेड़ के आसपास नूडल। यहाँ और वहां एक कर्सर का उल्लेख करने के अलावा कुछ भी नहीं। निश्चित रूप से उत्पादन कोड में _expand को पेश करने के लिए प्रदर्शन और संगतता पर पर्याप्त जानकारी नहीं है या अधिक प्रासंगिक, जेनेरिक पुस्तकालयों।_Expand बनाम बनाम जीएनयू

इससे भी बदतर, कोई भी समकक्ष फ़ंक्शन नहीं है जिसे मैं किसी भी gnu पुस्तकालयों में पा सकता हूं, इसलिए मेरे नए मित्र के साथ जो कुछ भी है, वह कम से कम पोर्टेबल नहीं होगा। जो शर्म की बात है, क्योंकि यह वास्तव में एक आकर्षक और रोमांचक क्षमता है। निश्चित रूप से, मैं realloc में खोद सकता है, और यह कैसे काम करता है अलग खींचो, लेकिन समस्या यह है कि अधिकांश कार्यान्वयन * nixes पर अत्यधिक चर है। तो मुझे एक पोर्टेबल _expand कोशिश करने और प्राप्त करने के लिए संस्करण के बाद संस्करण कोड करना होगा। फिर भी, यह हास्यास्पद लगता है कि ग्लिब या विस्तारित gnu libs में कुछ भी समान नहीं है।

  1. क्या कोई समान कार्य है जिसे मुझे लिनक्स हैकिंग के बारे में पता होना चाहिए? अधिकतर उत्तर
  2. क्या कोई मानक हुक है कि मैं एक समान कार्य कर सकता हूं? उत्तर
  3. क्या किसी को पता है कि किस प्रकार का प्रदर्शन _expand ऑफ़र करता है?
  4. एलएफएच पर आवंटित वस्तुओं के साथ यह कैसे बातचीत करता है?

मेरी रुचियों स्पष्ट करने के लिए, मैं एक अकेले से जुड़े संचायक कि पारंपरिक Deque कार्यान्वयन की तर्ज पर बहु-तत्व ब्लॉक आवंटन जबकि विखंडन को कम से कम करने की कोशिश में फैलता है का निर्माण करने की कोशिश कर रहा हूँ। तत्व जोड़ और हटाने के लिए उपयोग-मामलों को बाधित करके, मैं पूरी संरचना के साथ-साथ तत्व सम्मिलन और अनुक्रमण के लिए समय-प्रति-डिलीट अनुकूलित करने की उम्मीद कर रहा हूं। नतीजतन, _expand की "जोरदार विफलता" मुझे संरचना को बुद्धिमानी से सोचने देती है कि जब यह इनस्थल का आकार बदल सकती है, और इसका अर्थ यह है कि यह डेटा कहां रख सकता है।

+8

अच्छी साहित्यिक स्टाइलिंग। अब उन्हें मार डालो। हमारे सभी के लिए। जल्दी जल्दी। – dmckee

+0

शायद ऐसा कोई कारण है कि कोई भी इसका उपयोग क्यों नहीं करता है। अच्छी साहित्यिक स्टाइलिंग के लिए –

+4

+1। मुझे वे पसंद हैं। – Thilo

उत्तर

3

कि सी ++ new और delete सैन्स के साथ realloc के बराबर है, यह दिखाता है कि इन चीजों को कितना कम ध्यान मिलता है। असुरक्षित _expand को बड़े पैमाने पर अनदेखा किया जाता है जब यह ओएस स्तर पर लगातार उपलब्ध नहीं होता है। यदि आप अपना खुद का रोल करना चाहते हैं, तो मैलोक के उपयोगकर्ता द्वारा परिभाषित संस्करणों के लिए बहुत सी मिसाल है, और मेरे लिनक्स बॉक्स पर /usr/include/malloc.h में एक त्वरित रूप से दिखने के लिए स्पष्ट रूप से हुक दिखाता है ...

/* Called once when malloc is initialized; redefining this variable in 
    the application provides the preferred way to set up the hook 
    pointers. */ 
extern void (*__malloc_initialize_hook) __MALLOC_PMT ((void)); 
/* Hooks for debugging and user-defined versions. */ 
extern void (*__free_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr, 
             __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__malloc_hook) __MALLOC_PMT ((size_t __size, 
                __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__realloc_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr, 
                size_t __size, 
                __const __malloc_ptr_t)); 
extern __malloc_ptr_t (*__memalign_hook) __MALLOC_PMT ((size_t __alignment, 
                 size_t __size, 
                 __const __malloc_ptr_t)); 
extern void (*__after_morecore_hook) __MALLOC_PMT ((void)); 

ऐसा नहीं लगता है कि आप मौजूदा realloc कार्यान्वयन को उस विशेष निर्णय बिंदु पर कार्यान्वित करने में सक्षम होंगे, या आसानी से अंतर्दृष्टि प्राप्त कर सकते हैं कि यह इनसाइज़ का आकार बदल जाएगा या नहीं, इसलिए आपको सबकुछ फिर से लागू करना पड़ सकता है (या कई मौजूदा में से किसी एक को अनुकूलित करना होगा ढेर कार्यान्वयन)।

+1

मैं नए से काफी खुश हूं और लगभग हर समय हटा देता हूं, लेकिन यह विशेष समस्या ठीक से हल नहीं होती है जब तक कि आपके पास ढेर का आत्मनिरीक्षण करने का कोई तरीका न हो। इसके लिए आपको बहुत बहुत धन्यवाद, मुझे नहीं पता कि मैंने malloc.h की जांच क्यों नहीं की और मुझे थोड़ा नींव महसूस हुआ। क्या आपको कोई विचार है कि ये हुक पोर्टेबल और मानक हैं? उनमें से एक होने की उम्मीद होगी, लेकिन मुझे काफी बार जला दिया गया है। –

+0

@ जेक: दुर्भाग्यवश, मुझे लगता है कि वे जीएनयू libC के लिए विशिष्ट हैं। यदि आपको अधिक पोर्टेबिलिटी की आवश्यकता है, तो आप इलेक्ट्रिक बाड़ जैसे मॉलोक डीबग लाइब्रेरी देख सकते हैं और देख सकते हैं कि वे मेमोरी आवंटन दिनचर्या कैसे रोकते हैं। एक दृष्टिकोण जो आपके अनुरूप हो सकता है या नहीं हो सकता है, वह लाइब्रेरी निर्धारित करने के लिए एलडी_PRELOAD का उपयोग कर रहा है जो स्मृति आवंटन दिनचर्या के लिए ओवरराइड प्रदान करता है ... यह करना बहुत आसान है (मेरे पुराने उत्तरों में से एक ने इस पर चर्चा की - http://stackoverflow.com/questions/3410 9 0 9/एलडी-प्रीलोड-फॉर-सी-क्लास-विधियों/3411412 # 3411412 + मेरा (केवल) प्रश्न देखें), लेकिन मुझे यकीन नहीं है कि विंडोज़ पर कुछ ऐसा कैसे करें .... –

+0

जीएनयू libC शायद पर्याप्त है अभी के लिए, मुझे लगता है ... हालांकि मैं कुछ और गूढ़ मैलॉक्स का समर्थन करना चाहता हूं। मुझे लगता है कि यह करने लायक है, लेकिन मैं इसे करने के लिए एक होने के बारे में थोड़ा चिंतित हूं। –

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