2009-12-10 13 views
23

नहीं की तुलना भले ही मैं एक लंबे समय सी प्रोग्रामर हूँ, मैं हाल ही में पता चला कि एक सीधे एक के बजाय memcpy का उपयोग करने का एक और करने के लिए संरचना चर असाइन कर सकते हैं: इस हालांकिमैं structs क्यों प्रदान कर सकते हैं, लेकिन उन्हें

struct MyStruct a,b; 
... 
a = b; /* implicit memcpy */ 

सी के लिए थोड़ा "उच्च स्तरीय" महसूस करता है, यह निश्चित रूप से उपयोगी है। लेकिन कारण है कि मैं समानता और असमानता तुलना नहीं कर सकते:

if (a == b) ... 
if (a != b) ... 

वहाँ मानक के लिए किसी भी अच्छा कारण यह बाहर करने के लिए है? या यह एक असंगतता है - अन्यथा बहुत सुरुचिपूर्ण - मानक?

मुझे नहीं पता कि मैं अपने memcpy के स्वच्छ असाइनमेंट के लिए क्यों बदल सकता हूं, लेकिन मुझे उन बदसूरत memcmp को जगह में रखना होगा।

+3

+1 एक प्रश्न पूछने के लिए जो मुझे कुछ सिखाता है। –

उत्तर

27

प्रति comp.lang.c FAQ:

संरचना तुलना लागू करने के लिए एक संकलक के लिए कोई अच्छा तरीका नहीं है (यानी संरचनाओं के लिए == ऑपरेटर का समर्थन करने के) जो सी निम्न स्तर के स्वाद के अनुरूप है । एक सरल बाइट-बाय-बाइट तुलना संस्थापक संरचना में अप्रयुक्त "छेद" में मौजूद यादृच्छिक बिट्स पर मौजूद हो सकता है (जैसे पैडिंग का उपयोग बाद के क्षेत्रों के संरेखण संरेखण को रखने के लिए किया जाता है)। फ़ील्ड-बाय-फील्ड तुलना में बड़ी संरचनाओं के लिए दोहराव कोड की अस्वीकार्य मात्रा की आवश्यकता हो सकती है। किसी भी संकलक उत्पन्न तुलना सभी मामलों में उचित रूप से सूचक क्षेत्रों की तुलना करने की उम्मीद नहीं की जा सकती है: उदाहरण के लिए, यह चार * क्षेत्रों strcmp बजाय == साथ तुलना करने के लिए अक्सर उचित है।

यदि आपको दो संरचनाओं की तुलना करने की आवश्यकता है, आपको ऐसा करने के लिए अपना स्वयं का फ़ंक्शन लिखना होगा, फ़ील्ड द्वारा फ़ील्ड।

+2

मुझे पता था कि इसके लिए एक अच्छा कारण था। मैं बस संरचनाओं में छेद के बारे में भूल गया। –

+0

धन्यवाद। मैं पैडिंग तर्क समझता हूं। लेकिन क्या पॉइंटर-फील्ड तर्क असाइनमेंट के लिए समान रूप से अच्छा नहीं है? – Tomas

+0

@ टॉमस नहीं, यह वास्तव में एक ही वस्तु के लिए एकाधिक पॉइंटर्स होने के लिए काफी आम है। एक पेड़ पर विचार करें, प्रत्येक बच्चे के माता-पिता को अतिरिक्त पॉइंटर्स के साथ। –

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

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