Struct

2010-09-13 12 views
5

हाल ही में मैं कुछ सी कोड की समीक्षा की और कुछ निम्नलिखित के बराबर पाया:Struct

struct foo { 
    int some_innocent_variables; 
    double some_big_array[VERY_LARGE_NUMBER]; 
} 

लगभग होने के नाते, लेकिन काफी नहीं, लगभग पूरी तरह से सी में एक नौसिखिया, मैं सोच में सही हूँ कि सरणी सदस्य की वजह से यह संरचना अंतरिक्ष के उपयोग में बहुत अक्षम है? क्या होता है जब यह संरचना फ़ंक्शन के लिए तर्क के रूप में पारित हो जाती है? क्या यह पूरी सरणी में ढेर पर पूरी तरह से कॉपी किया गया है?

क्या अधिकांश मामलों में double *some_pointer इसके बजाय बेहतर होगा?

+0

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

उत्तर

7

यदि आप मूल्य से गुजरते हैं तो यह सब कुछ की एक प्रति बना देगा। लेकिन यही कारण है कि पॉइंटर्स मौजूद हैं।

//Just the address is passed 
void doSomething(struct foo *myFoo) 
{ 

} 
+0

पास-बाय-रेफरेंस दक्षता प्राप्त करने के दौरान जितना संभव हो सके पास-बाय-वैल्यू के करीब रहने के लिए आप 'स्ट्रक्चर फू कॉन्स * कॉन्स मायफू' का उपयोग कर सकते हैं। यह संकलक को आपको चेतावनी देने के लिए बताएगा जब आप गलती से पॉइंटर या पॉइंट-टू वैल्यू को संशोधित करने का प्रयास करेंगे। अप्रतिबंधित डाउनवोट के कारण – altendky

0

हां, सी में आप आमतौर पर दक्षता कारणों से संरचना के लिए एक सूचक को पास करेंगे।

2

एक तर्क के रूप में पारित होने की प्रतिलिपि बनाई जाएगी, जो संरचनाओं को पारित करने का बहुत ही अक्षम तरीका है, विशेष रूप से बड़े। हालांकि, मूल रूप से, पॉइंटर द्वारा कार्यों के लिए structs पारित कर रहे हैं।

और

के बीच

double some_big_array[VERY_LARGE_NUMBER]; 

double *some_pointer 
का चयन केवल प्रोग्राम डिजाइन और कैसे इस क्षेत्र/संरचना का उपयोग किया जाएगा पर निर्भर करता है। उत्तरार्द्ध परिवर्तनीय आकार भंडारण का उपयोग करने की अनुमति देता है, हालांकि गतिशील आवंटन की आवश्यकता हो सकती है।

+0

+1 –

0

structs में सरणी का उपयोग करने के कई कारण हैं। उनमें से तथ्य यह है कि structs मूल्य से कार्यों के लिए पारित कर रहे हैं, जबकि सरणी संदर्भ द्वारा पारित कर रहे हैं। उस ने कहा, यह संरचना शायद पॉइंटर्स के साथ कार्यों के लिए पारित किया गया है।

1

जैसा कि अन्य ने कहा है, उस प्रकार की वस्तुएं आमतौर पर पॉइंटर्स (हमेशा sizeof (struct foo) बाइट्स, अक्सर 4 बाइट्स) के साथ पास की जाती हैं।

तुम भी "struct हैक" (यह भी संकेत दिए गए के साथ चारों ओर से पारित कर दिया) देख सकते हैं:

struct foo { 
    int some_innocent_variables; 
    double some_array[]; /* C99 flexible array member */ 
    /* double some_array[1]; ** the real C89 "struck hack" */ 
} 

यह "struct हैक" एक सरणी malloc कॉल द्वारा आकार हो जाता है।

/* allocate an object of struct foo type with an array with 42 elements */ 
struct foo *myfoo = malloc(sizeof *myfoo + 42 * sizeof *myfoo->some_array); 
/* some memory may be wasted when using C89 and 
    the "struct hack" and this allocation method */ 
0

संपादित करें: जब तक आप संदर्भ (इसे पॉइंटर का उपयोग करके) पास करते हैं, तब तक यह संरचना ठीक है।

ऑफटॉपिक: संरचना हैक से सावधान रहें, क्योंकि यह not strictly standard compliant है; यह स्वचालित पैडिंग को अनदेखा करता है। यूनिक्स आईपीसी मैसेजिंग कतार इसका उपयोग करते हैं (struct msgbuf देखें), हालांकि, और लगभग किसी भी कंपाइलर के साथ काम करना निश्चित रूप से है।

यह कहा गया है कि, उस संरचना का उपयोग करने वाले फ़ंक्शंस प्रतिलिपि का उपयोग करने के बजाय पॉइंटर्स का उपयोग कर सकते हैं।

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