2010-11-03 14 views
9

क्या कोई अच्छा .NET में एक निश्चित-आकार सरणी को लागू करने का तरीका है जिसे असुरक्षित कोड की आवश्यकता नहीं है?.NET में असुरक्षित कोड का उपयोग किए बिना कुशल फिक्स्ड-साइज एरे संभव हैं?

मेरा लक्ष्य एक मान प्रकार बनाना है जो एक निश्चित आकार सरणी का प्रतिनिधित्व करता है जिसे अन्य प्रकारों में एम्बेड किया जा सकता है (एक सदस्य के रूप में शामिल किया जा सकता है) यानी मैं विशेष रूप से एक अलग वस्तु के रूप में एक सरणी बनाने से बचने की उम्मीद कर रहा हूं टाइप करें जो इसे घोषित करता है।

मुझे एहसास है कि .NET का एआरई का कार्यान्वयन शानदार है और सीएलआर/सीआईएल स्तर पर समर्थित है - और वास्तव में बहस नहीं करना चाहता कि क्या केवल सरणी का उपयोग करना है या नहीं ... यहां अन्वेषण सुरक्षित है या नहीं , निश्चित आकार, मूल्य प्रकार कार्यान्वयन के साथ लगभग दक्षता के साथ संभव है।

+2

क्या आप यह समझने में मेरी सहायता कर सकते हैं कि यह क्या लाभ प्रदान करता है कि एक साधारण सरणी (प्रकार के भीतर घोषित) नहीं कर सकता है? अगर मैं यह भी नहीं जानता कि उद्देश्य क्या है, तो वैकल्पिक कार्यान्वयन के साथ आना मुश्किल है। क्या यह यहां उल्लिखित सरणी के कुछ आपत्तियों को खत्म करने के बारे में है ?: http://blogs.msdn.com/b/ericlippert/archive/2008/09/22/arrays-cononsidered-somply-harmful.aspx –

+1

@Robert: The उद्देश्य एक निश्चित आकार मूल्य-प्रकार सरणी प्राप्त करने में सक्षम होना है जिसे अन्य प्रकार के निजी सदस्य के रूप में उपयोग किया जा सकता है। एक कस्टम शब्दकोश या लिंक्ड-सूची कार्यान्वयन पर विचार करें ... प्रत्येक बाल्टी/नोड को अपने स्वयं के, निश्चित-आकार सरणी को रखने के लिए फ़्लैटन होने पर ढेर आवंटन की संख्या को कम किया जा सकता है। – Mark

उत्तर

5

उद्देश्य एक निश्चित-आकार मूल्य प्रकार सरणी जो अन्य प्रकार पर एक निजी सदस्य के रूप में इस्तेमाल किया जा सकता है करने में सक्षम होना है। एक कस्टम शब्दकोश या लिंक्ड सूची कार्यान्वयन पर विचार करें ... ढेर आवंटन की संख्या कम करता है, तो प्रत्येक बकेट/नोड यह खुद को रोकने के लिए है, निश्चित-आकार सरणी चपटा है हो सकता है।

अपनी सरणी को एक मान प्रकार बनाना आवश्यक नहीं है कि यह ढेर पर संग्रहीत किया जा रहा है। वास्तव में, यदि यह एक संदर्भ प्रकार के भीतर एम्बेडेड एक मान प्रकार है, तो संभवतः संदर्भ प्रकार के साथ हीप पर संग्रहीत किया जा रहा है, न कि स्टैक पर।

तो इसे एक मूल्य प्रकार बनाने से हीप आवंटन कम नहीं होगा।

अधिक यहाँ जानकारी: http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

+0

यूप, यह ढेर पर खत्म हो जाएगा। और वह इस 512 बाइट संरचना को कई बार कॉपी कर देगा, इसमें कोई संदेह नहीं है। –

+2

इस प्रश्न के पीछे विचारधारा विशेष रूप से कक्षा में संरचना को एम्बेड करने और वर्ग के साथ ढेर पर आवंटित संरचना रखने का लक्ष्य था। यदि एक निजी सदस्य के रूप में लागू किया गया है और सही तरीके से उपयोग किया जाता है, तो इसे कई बार कॉपी नहीं किया जाना चाहिए। – Mark

+1

... और यह ढेर आवंटन को कम करेगा क्योंकि अब यह केवल एक बार (युक्त कक्षा के लिए) आवंटित करता है और फिर सरणी के लिए नहीं। –

2

कुछ परावर्तक का उपयोग कर अनुसंधान के बाद, यह पता चला है कि निम्नलिखित एक स्वीकार्य (प्रदर्शन के लिहाज से) समाधान का प्रतिनिधित्व करता है, सी # एक सीआईएल स्विच बयान में पूर्णांक के खिलाफ एक स्विच बयान संकलित के बाद से जो एक जंप-लिस्ट के रूप में लागू किया गया है ... यही है - गेटटर लगभग 11 सीआईएल निर्देशों में निष्पादित करता है, जो ठीक है।

public struct EmbeddedArray<T> 
    { 
     private T _element0; 
     private T _element1; 
     private T _element2; 

     public int Length { get { return 3; } } 


     public T this[int index] 
     { 
      get 
      { 
       switch (index) 
       { 
        case 0: 
         return _element0; 
        case 1: 
         return _element1; 
        case 2: 
         return _element2; 
       } 
       throw new ArgumentOutOfRangeException("index"); 

      } 
     } 
    } 

कृपया नीचे हंस 'टिप्पणी देखें। यह पता चला है कि यह प्रदर्शनकर्ता के रूप में नहीं है जैसा कि मैंने आशा की थी ... एक बार जब सीआईएल को देशी मशीन कोड में संकलित किया जाता है, तो मापा गया प्रदर्शन एक .NET सरणी उत्पन्न करेगा।

+6

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

+1

@ हंस - आपकी टिप्पणी के लिए, फिर से, बहुत सम्मान। थोड़ा प्रोफाइलिंग करने के बाद, यह पता चला है कि आप वास्तव में सही हैं ... आईएल स्विच स्टेटमेंट थोड़ा भ्रामक था। साथ ही, कक्षा का उपयोग करने वाले वर्ग से अलग सरणी आवंटित करने की लागत एक सरणी के प्रदर्शन लाभ के लिए भुगतान करने के लिए एक बहुत ही सस्ती कीमत है। अंगूठे ऊपर, हंस - मेरी इच्छा है कि आप एक टिप्पणी के उत्तर को एक उत्तर पोस्ट करेंगे - यह यहां स्वीकार्य उत्तर होगा। – Mark

+1

आपके प्रश्न में अंतिम अनुच्छेद में सही उत्तर के बारे में बात करने की संभावना शामिल नहीं है। –

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

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