2017-06-06 10 views
5

कहता है कि मेरे पास 2 फ़ील्ड और सी के कार्यान्वयन के साथ एक संरचना है जिसमें मेरे पास इन क्षेत्रों के बीच कुछ पैडिंग भी है।क्या स्ट्रक्चर असाइनमेंट गारंटी पैडिंग बराबर

यदि मैं संरचना के दो चर बना देता हूं और एक दूसरे को असाइन करता हूं, तो क्या पैडिंग बराबर होने की गारंटी होगी?

मुझे पता है कि अधिकांश कंपाइलरों के लिए ऐसा होगा (क्योंकि वे सिर्फ memcpy कहते हैं), लेकिन मैं जानना चाहता हूं कि मानक में पैडिंग के बारे में क्या निर्दिष्ट है?

इस प्रश्न का इरादा है, क्या मैं structs की समानता की जांच के लिए memcmp का उपयोग कर सकता हूं।

कहें कि मेरे पास एक कंपाइलर है जो कोड को उत्सर्जित करता है जो memcpy करने के बजाय संरचना के सभी सदस्यों को निर्दिष्ट करता है, क्या यह संरचना संचालन के असाइनमेंट का वैध कार्यान्वयन होगा?

+1

आप पैडिंग * मान * के बारे में चिंतित हैं, आकार नहीं, सही? –

+0

सामान्य पैडिंग में एक ही सामग्री नहीं होगी। ऐसा लगता है कि यह शुरू नहीं हुआ है।'X = y' के मामले में, मुझे लगता है कि पैडिंग समान है या नहीं, कार्यान्वयन निर्भर है। – BLUEPIXY

+0

@EugeneSh। हां पैडिंग के मूल्य, पैडिंग का आकार समान होगा क्योंकि वे एक ही संरचना हैं। –

उत्तर

6

मानक एक note 51 of 6.2.6.1 General में कहते हैं:

इस प्रकार, उदाहरण के लिए, संरचना काम किसी भी गद्दी बिट्स की प्रतिलिपि नहीं है।

+0

धन्यवाद, जो सीधे समस्या का समाधान करता है। असर नोट 52 भी memcmp के बारे में सीधे बात करता है। लेकिन यह == से अधिक है। वही विचार –

+0

हाँ, 52 भी दिलचस्प है। क्या आपको लगता है कि इसे जोड़ा जाना चाहिए? –

+0

कड़ाई से बोलना यह == ऑपरेटर है जो structs के लिए उपलब्ध नहीं है। लेकिन आप इसे अतिरिक्त रूप से जोड़ सकते हैं ताकि इसे डिजाइन करने के पीछे प्रेरणा पर कुछ प्रकाश डाला जा सके। –

1

मुझे नहीं लगता कि आप memcmp का उपयोग कर सकते हैं, क्योंकि सदस्यों के बीच स्मृति (यानी "पैडिंग" -एरिया में सामग्री) को निश्चित मान रखने की गारंटी नहीं है, और इस तरह के एक स्ट्रक्चर-ऑब्जेक्ट को असाइन करना एक और पैडिंग सामग्री की प्रतिलिपि बनाने की आवश्यकता नहीं है।

+0

मेरा हंच आपके साथ है, लेकिन जैसा कि यह एक [भाषा-वकील] प्रश्न है, आपको मानक से सबूत प्रदान करने की उम्मीद है :) – Quentin

+0

तो मूल रूप से आपका मतलब है कि पैडिंग के साथ एक संरचना पर memcmp को कॉल करना अपरिभाषित व्यवहार होगा क्योंकि आप हैं बाइट्स को पढ़ने का प्रयास कर रहे हैं जो अनियमित हैं? –

+0

क्या होगा यदि असाइनमेंट के आरएचएस पर संरचना मेमसेट के माध्यम से शुरू की जाती है? –

6
6.2.6.1 जनरल
...
      जब एक मूल्य, संरचना या संघ प्रकार का ऑब्जेक्ट में संग्रहीत होता है बाइट्स एक सदस्य वस्तु में शामिल है, किसी भी पैडिंग बाइट्स के अनुरूप ऑब्जेक्ट प्रस्तुति अनिर्दिष्ट मान लेती है। 51) संरचना या संघ वस्तु का मूल्य कभी भी एक जाल प्रतिनिधित्व नहीं होता है, भले ही संरचना या संघ वस्तु के सदस्य का मूल्य एक जाल प्रतिनिधित्व हो सकता है।

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

C 2011 Online Draft

फ़ुटनोट 51 सीधे अपने प्रश्न के पते - गद्दी बिट्स की सामग्री काम में कॉपी नहीं किया जा सकता है, तो memcmp समानता लिए दो structs की तुलना के लिए काम न करें।

+0

धन्यवाद, जो मेरी समस्या का समाधान करता है। –

+0

@ यूजीन के उत्तर को स्वीकार करते हुए क्योंकि इसका उत्तर पहले दिया गया था। –

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