2011-03-21 14 views
32

अगर मैं (सी) में एक और एक में एक संरचना को दोहराने के लिए चाहते हैं, क्या समर्थक & चोर के के होते हैं:संरचना असाइनमेंट या memcpy?

struct1 = struct2; 

बनाम

memcpy(&struct1, &struct2, sizeof(mystruct_t)); 

वे बराबर हैं? प्रदर्शन या स्मृति उपयोग में कोई अंतर है?

+3

बस संरचना के अंदर स्मृति आवंटन से सावधान रहें। उदाहरण के लिए यदि आपके पास एक स्ट्रक्चर है जिसमें स्ट्रिंग में पॉइंटर होता है और आप स्ट्रिंग के लिए मेमोरी आवंटित करते हैं। वह स्मृति कॉपी नहीं होती है। स्मृति के सूचक को कॉपी किया जाता है, लेकिन स्मृति ही नहीं। दूसरे शब्द में इस प्रकार की असाइनमेंट गहरी प्रति नहीं है। उस माटर के लिए न ही वेनिला memcpy है। यह भ्रमित हो सकता है कि आवंटित स्मृति का मालिक कौन है। – Pemdas

+0

मुझे लगता है कि यह प्रश्न स्टैक ओवरफ्लो के लिए अधिक उपयुक्त है। – karlphillip

+2

मुझे लगता है कि इस प्रश्न का पहले से ही उत्तर दिया गया था: http://stackoverflow.com/q/4931123/176769 – karlphillip

उत्तर

31

struct1=struct2; नोटेशन न केवल संक्षिप्त है, बल्कि कम और संकलक के लिए अधिक अनुकूलन अवसर छोड़ देता है। = का अर्थपूर्ण अर्थ एक असाइनमेंट है, जबकि memcpy बस स्मृति की प्रतिलिपि बनाता है। यह पठनीयता में भी एक बड़ा अंतर है, हालांकि memcpy इस मामले में समान है।

= का उपयोग करें।

+0

संरचना एस और संरचना * एस के बीच एस = mystruct पर प्रमुख समस्या। दोनों बराबर के साथ अच्छी तरह से काम करते हैं, इसलिए आप पढ़ने से अंतर नहीं देख सकते हैं। * एस आपको समान देता है, जबकि संरचना आपको एक प्रतिलिपि देता है। जब यह deallocate करने के लिए आता है, यह समान संरचना * एस के साथ ठीक काम करता है; लेकिन अगर आप मूर्खतापूर्ण रूप से संरचना के संस्करण के साथ केवल एक dealloc करते हैं तो यह mystruct लीक। पॉइंटर्स के साथ काम करना भी तेज़ है। बस ध्यान रखें कि आप क्या कर रहे हैं, और फिर चीजें ठीक होनी चाहिए। YMMV। – DragonLord

2

मुझे प्रदर्शन अंतर के बारे में निश्चित नहीं है, हालांकि मुझे लगता है कि अधिकांश कंपाइलर हुड के नीचे memcpy का उपयोग करेंगे।

मैं ज्यादातर मामलों में असाइनमेंट पसंद करूंगा, इसे पढ़ने में बहुत आसान है और उद्देश्य क्या है इसके बारे में अधिक स्पष्ट है। कल्पना कीजिए कि आपने किसी भी प्रकार के structs के प्रकार को बदल दिया है, संकलक आपको एक संकलक त्रुटि देने या ऑपरेटर = (यदि कोई मौजूद है) का उपयोग करके आपको किस बदलाव की आवश्यकता है, तो मार्गदर्शन करेगा। जबकि दूसरा एक सूक्ष्म बग पैदा करने की संभावना के साथ अंधा कर देगा।

2

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

एक सीधी असाइनमेंट पढ़ने के लिए स्पष्ट है।

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

+0

यदि आप 'sizeof' और सही संरचना का उपयोग करते हैं तो' memcpy' के बारे में कुछ भी जोखिम भरा नहीं है। मुझे लगता है कि आप संरचना गलत कर सकते हैं और कोई त्रुटि नहीं होगी।मुझे लगता है कि आपको अंत में एक सेगमेंटेशन गलती मिल जाएगी। –

4

बहुत ही विषय से संबंधित इस बातचीत की जाँच करें: http://bytes.com/topic/c/answers/670947-struct-assignment

असल में, वहाँ है कि सूत्र में कोने मामलों को लेकर काफी मतभेद के एक बहुत हैं संरचना की प्रतिलिपि क्या करेगी। यह स्पष्ट है कि संरचना के सभी सदस्य सरल मान हैं (int, double, आदि)। भ्रम आता है जिसमें सरणी और पॉइंटर्स और पैडिंग बाइट्स के साथ क्या होता है।

memcpy के साथ क्या होता है, यह सब कुछ स्पष्ट होना चाहिए, क्योंकि यह प्रत्येक बाइट की एक क्रियात्मक प्रति है। इसमें पूर्ण मेमोरी पॉइंटर्स, रिश्तेदार ऑफसेट आदि शामिल हैं।

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