2013-07-18 8 views
10

सी/सी ++ बिटफील्ड में हार्डवेयर ड्राइवरों और बाइनरी नेटवर्क स्थानान्तरण में बहुत अधिक एप्लिकेशन लगते हैं। हालांकि वे व्यापक रूप से उपयोग नहीं किए जाते हैं और आम तौर पर निराश होते हैं, क्योंकि वास्तविक बाइनरी लेआउट कार्यान्वयन विशिष्ट है, जैसा कि सी 99 मानक 6.7.2.1/10 - "संरचना और संघ विनिर्देशक" से इस उद्धरण में देखा गया है;बिटफील्ड, कार्यान्वयन विशिष्ट क्यों?

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

मेरा प्रश्न अपेक्षाकृत सरल है; समिति ने कुछ क्षेत्रों को कार्यान्वित करने के लिए थोड़ा क्षेत्र छोड़ने का फैसला क्यों किया, और इस प्रकार इसे एक कंपाइलर निर्माण बना दिया, जिसका मुख्य रूप से कम स्मृति उपयोग के लिए उपयोग किया जा सकता है, जहां कई मामलों में यह अच्छा बाइनरी लेआउट प्रदान करने के लिए उपयोग किया जा सकता है, और मुफ्त बिट-फिडलिंग कोड से डेवलपर्स?

+0

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

+1

मुझे यकीन है कि प्रति बाइट बिट्स की संख्या 8 होने की आवश्यकता नहीं है इसके साथ कुछ करने के लिए भी कुछ है। –

+0

@ एमआर लिस्टर: यह सुनिश्चित करने के लिए कि अगले बाइट में एक फ़ील्ड गठबंधन किया गया है, और इसलिए बाइट के बीच में शुरू नहीं होता है, हमें शून्य आकार बिट फ़ील्ड दिया जाता है, है ना? - तो यह पहले से ही मानक में है। – Skeen

उत्तर

7

इसी कारण से कई अन्य चीजों को मानक द्वारा सख्ती से निर्दिष्ट नहीं किया जाता है: बड़ी संख्या में प्लेटफार्मों और प्रणालियों के लिए एक अनुपालन कंपाइलर बनाने के लिए लचीलापन की अनुमति देने के लिए, और अभी भी एक प्रभावशाली कंपाइलर है।

विशेष रूप से, बिटफिल्ड को किसी विशेष बिट/बाइट-ऑर्डर में संग्रहीत किया जाना चाहिए जिससे यह उन मशीनों पर बहुत धीमी हो जाएगी जिनके प्राकृतिक बाइट-ऑर्डर "गलत तरीके से" है।

हां, इसका मतलब यह है कि कई आर्किटेक्चर और प्लेटफार्मों में बिटकफील्ड पोर्टेबल बनाने के लिए पीछे एक सही दर्द है। यदि आपको वास्तव में इसकी आवश्यकता है, तो शायद आपको किसी अन्य समाधान पर विचार करना चाहिए ...

+1

तो, कम से कम मेरी दुनिया में, इसका मतलब है कि संभावित रूप से धीमी सुविधा से बचने के लिए, वे अधिकतर अनुपयोगी सुविधा के साथ समाप्त हो गए? – Skeen

+2

नहीं, यह पूरी तरह प्रयोग योग्य है, जब तक आपको यह भी आवश्यकता नहीं है कि यह सही पोर्टेबल है। ध्यान दें कि कई आर्किटेक्चर के लिए, मुख्य अंतर बाइट-ऑर्डर होगा, बिट-ऑर्डर नहीं, इसलिए जब तक प्रोसेसर समान होता है तब तक आप ठीक होते हैं। और मुझे यकीन है कि ज्यादातर लोग कम से कम जोर से शिकायत करेंगे अगर यह कुशल नहीं था (लेकिन पूरी तरह से पोर्टेबल और अच्छी तरह से परिभाषित)। –

+1

आप शायद सही हैं, हालांकि मेरे पास एक पोर्टेबल अच्छी तरह से परिभाषित बिटफील्ड होगा, और फिर जब भी मुझे प्रदर्शन की आवश्यकता हो, तो थोड़ा-सा झुकाव करें .. दूसरी तरफ से। – Skeen

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