2012-02-20 28 views
5

हम जब भी संभव हो सी # में संरचना का उपयोग करते हैं क्योंकि मुख्य रूप से यह ढेर पर संग्रहीत होता है और इसके लिए कोई ऑब्जेक्ट नहीं बनाया जाता है। यह प्रदर्शन को बढ़ावा देता है।यदि किसी सरणी को संरचना (सी #) में तत्व के रूप में प्रयोग किया जाता है, तो यह कहां संग्रहीत किया जाता है?

दूसरी तरफ, तीर ढेर पर संग्रहीत होते हैं।

struct MotionVector 
{ 
    int[] a; 
    int b; 
} 

तो परिणाम क्या होगा:

मेरा प्रश्न है, अगर मैं, कुछ इस प्रकार struct के एक तत्व के रूप में एक सरणी शामिल है। क्या वह सरणी ढेर पर संग्रहीत की जाएगी? या संरचना का उपयोग करने का प्रदर्शन लाभ खो जाएगा?

+2

http://stackoverflow.com/questions/3942721/c-structs-versus-classes –

+1

क्या आपके पास वास्तविक प्रदर्शन समस्याएं हैं? Http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx – ken2k

+0

http://stackoverflow.com/a/1114152/55209 देखें - एक उत्कृष्ट स्पष्टीकरण –

उत्तर

0

यदि आप गतिशील रूप से तत्व बनाना नहीं चाहते हैं, तो स्टार्टअप के दौरान मोशन वेक्टर उदाहरणों का एक (बड़ा) बफर बनाने और आवश्यकता होने पर पुन: उपयोग करने पर विचार करें। तब आपको गतिशील रूप से उन्हें बनाने/नष्ट करने का दंड नहीं मिलेगा।

बेशक आपको 'मुक्त' उदाहरण प्राप्त करने के लिए कुछ छोटे कार्यों को लिखना है और एक प्राप्त करने के लिए, उस के लिए संरचना में एक बूलियन का उपयोग करें (या एक इंटरफ़ेस का उपयोग करके)।

ऐसा करने के लिए आप कर सकते थे जैसे:

MotionVectors motionVectors; 

MotionVector वर्ग के लिए एक बूलियन जोड़ें::

public class MotionVector 
{ 
    bool InUse { get; set; } 

    public MotionVector() 
    { 
     InUse = false; 
    } 
} 

नया वर्ग को परिभाषित करें

अपने अनुप्रयोग के initialisation motionvectors दौरान बनाएं मोशन वेक्टर:

class MotionVectors 
{ 
    MotionVector _instances[100]; 

    public void Free(MotionVector vector) 
    { 
     var index = 'search vector in _instances' 
     _instances[index].Inuse = false; 
    } 

    public MotionVector GetNewInstance() 
    { 
     var index = 'first free vector in _instances' 
     _instances[index].Inuse = true; 
     return _instances[index]; 
    } 
} 
+0

यह वास्तव में एक अच्छा विचार प्रतीत होता है। बहुत बहुत धन्यवाद। क्या आप कुछ उदाहरणों को इंगित कर सकते हैं कि इसे कैसे करें? – shahensha

+0

मुझे डर है कि मेरे पास असली उदाहरण नहीं हैं, हालांकि मैं अपना जवाब थोड़ा सा अनुकूलित करूंगा। –

+0

बहुत बहुत धन्यवाद @ मिशेल – shahensha

8

केवल सरणी के सूचक को ढेर में संग्रहीत किया जाएगा। वास्तविक सरणी ढेर में संग्रहित किया जाएगा।

1

int[] a एक संदर्भ प्रकार है यानी यह पूर्णांक की एक सरणी का संदर्भ देता है। 'संदर्भ' स्वयं ढेर पर संग्रहीत किया जाएगा। हालांकि, डेटा यह संदर्भ ढेर पर संग्रहीत किया जाएगा जब आप कुछ इस तरह करते हैं:

MotionVector z; 
z.a = new int[10]; 
1

आप अपने struct में एक के लिए एक संदर्भ का आयोजन करेगा; वह ढेर पर संरचना का हिस्सा होगा।

वास्तविक int [] ऑब्जेक्ट, यदि आप इसे प्रारंभ करते हैं, तो जहां भी यह अन्यथा जाएगा (अधिकांश आर्किटेक्चर में ढेर) जाएगा।