दिलचस्प पोस्ट
शॉर्टकट के साथ एंड्रॉइड स्टूडियो में आवश्यक वर्गों को कैसे आयात करें? फ़ॉर्म सबमिट करने के लिए सामान्य लिंक का उपयोग करें क्यों Jquery केवल पहली div तत्व को प्रभावित करता है? क्या "वापसी झूठी" क्या करता है? फ़ंक्शन को हर 60 सेकंड कॉल करना NSString का आकार कैसे प्राप्त करें PHP में दोषपूर्ण यूटएफ -8 स्ट्रिंग का पता कैसे लगा सकता है? स्क्रॉल दृश्य स्क्रॉल पदों को सिंक्रनाइज़ करें – एंड्रॉइड उद्देश्य सी – संश्लेषण संपत्ति पासवर्ड भूल गए: पासवर्ड भूल गए फ़ंक्शन को लागू करने का सबसे अच्छा तरीका क्या है? क्यों सी # डिफ़ॉल्ट रूप से गैर-वर्चुअल रूप से लागू करता है? डुप्लिकेट्स सूची में (प्रोलॉग) निकालें क्यों सरणी IList लागू करता है? क्या फ़ायरबेज 3 में टोकन के सर्वर साइड सत्यापन करना अभी भी संभव है? पीडीएफ फाइल को एक नई टैब या विंडो में डाउनलोड करने के बजाय कैसे खोलें (asp.net का उपयोग कर)?

Bitfields में क्यों एक बिट endianness मुद्दा है?

बिटफ़ेल्ड का उपयोग करने वाला कोई पोर्टेबल कोड छोटे और बड़े-एंडियन प्लेटफॉर्म के बीच अंतर करने लगता है। ऐसे कोड के उदाहरण के लिए लिनक्स कर्नल में संरचना आईपीएचडीआर की घोषणा देखें। मुझे समझ में नहीं आ रहा है कि क्यों बिट एंडियनेंस एक मुद्दा है।

जहां तक ​​मैं समझता हूं, बिटफ़ील्ड पूरी तरह से कंपाइलर निर्माण होते हैं, बिट स्तर जोड़तोड़ की सुविधा के लिए इस्तेमाल किया जाता है

उदाहरण के लिए, निम्न बिटफ़ील्ड पर विचार करें:

 संरचना पार्सेड {
     अहस्ताक्षरित अंतर f1: 1;
     अहस्ताक्षरित इंट f2: 3;
     अहस्ताक्षरित इंडस्ट्रीज़ f3: 4;
 };
 uint8_t i;
 संरचना ParsedInt * d = & i;

यहां, d->f2 लिखना बस कहने का एक कॉम्पैक्ट और पठनीय तरीका है (i>>1) & (1<<4 - 1)

हालांकि, वास्तुकला के बावजूद, बिट ऑपरेशन अच्छी तरह से परिभाषित होते हैं और काम करते हैं। तो, कैसे बिटफ़ील्ड पोर्टेबल नहीं हैं?

वेब के समाधान से एकत्रित समाधान "Bitfields में क्यों एक बिट endianness मुद्दा है?"

सी मानक से, कंपाइलर किसी भी यादृच्छिक तरीके से बिट फ़ील्ड को बहुत ज्यादा स्टोर करने के लिए स्वतंत्र है। आप किसी भी मान्यताओं को कभी नहीं बना सकते जहां बिट्स को आवंटित किया जाता है। यहां कुछ ही बिट-फ़ील्ड संबंधित चीजें हैं जो सी मानक द्वारा निर्दिष्ट नहीं हैं:

अनिर्दिष्ट व्यवहार

  • एक बिट-फील्ड (6.7.2.1) रखने के लिए आवंटित संबोधित भंडारण इकाई के संरेखण

कार्यान्वयन-परिभाषित व्यवहार

  • एक बिट-फील्ड स्टोरेज-यूनिट सीमा (6.7.2.1) फैल सकता है।
  • इकाई के भीतर बिट-फ़ील्ड के आवंटन का क्रम (6.7.2.1)।

बिग / थोड़ा एंडियन कोर्स भी कार्यान्वयन-परिभाषित है। इसका अर्थ है कि आपके संरचना को निम्नलिखित तरीकों से आवंटित किया जा सकता है (16 बिट ints मानते हुए):

 PADDING : 8 f1 : 1 f2 : 3 f3 : 4 or PADDING : 8 f3 : 4 f2 : 3 f1 : 1 or f1 : 1 f2 : 3 f3 : 4 PADDING : 8 or f3 : 4 f2 : 3 f1 : 1 PADDING : 8 

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

और फिर मैंने यह भी उल्लेख नहीं किया है कि यदि आप सादे "फ़ीट" प्रकार के रूप में "int" का उपयोग करते हैं, तो कार्यान्वयन-परिभाषित व्यवहार, या यदि आप (अहस्ताक्षरित) int = कार्यान्वयन-परिभाषित व्यवहार की तुलना में किसी अन्य प्रकार का उपयोग करते हैं, तो इसका भी उल्लेख नहीं किया है।

तो सवाल का उत्तर देने के लिए, पोर्टेबल बिट-फील्ड कोड जैसी कोई चीज नहीं है, क्योंकि सी मानक बेहद अस्पष्ट है कि कैसे बिट फ़ील्ड कार्यान्वित होनी चाहिए। एकमात्र चीज़ बिट-फ़ील्ड के साथ भरोसा किया जा सकता है बूलियन मानों का हिस्सा होना, जहां प्रोग्रामर स्मृति में बिट्स के स्थान से संबंधित नहीं है।

केवल पोर्टेबल समाधान बिट फ़ील्ड के बजाय बिट-वार ऑपरेटर का उपयोग करना है उत्पन्न मशीन कोड बिल्कुल वही होगा, लेकिन नियतात्मक। किसी भी सिस्टम के लिए किसी भी सी संकलक पर बिट-वार ऑपरेटर 100% पोर्टेबल हैं।

जहाँ तक मैं समझता हूं, बिटफ़ील्ड पूरी तरह कंपाइलर हैं

और यह समस्या का हिस्सा है। अगर बिट-फ़ील्ड का उपयोग कंपाइलर के स्वामित्व में था, तो कैसे कंपाइलर ने बिट्स पैक किया या उन्हें आदेश दिया कि किसी को कोई चिंता नहीं होगी।

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

संक्षेप में, बीट-फ़ील्ड पर्याप्त रूप से निर्दिष्ट नहीं हैं, जिससे वे उन स्थितियों के लिए उपयोगी बना सकते हैं, जिन्हें वे सबसे अधिक इस्तेमाल करते हैं।

आईएसओ / आईईसी 9899: 6.7.2.1 / 10

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

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

EXP11-C भी देखें किसी असंगत प्रकार के डेटा के लिए एक प्रकार की अपेक्षा ऑपरेटरों को लागू न करें ।

बिट फील्ड अभिगम अंतर्निहित प्रकार पर परिचालन के मामले में कार्यान्वित किया जाता है। उदाहरण के लिए, unsigned int तो अगर आपके पास ऐसा कुछ है:

 struct x { unsigned int a : 4; unsigned int b : 8; unsigned int c : 4; }; 

जब आप फ़ील्ड b तक पहुंचते हैं, तो कंपाइलर एक पूर्ण unsigned int तक पहुंचता है और फिर बदलाव और मास्क उचित बिट श्रेणी में आता है। (ठीक है, यह करने की ज़रूरत नहीं है , लेकिन हम ऐसा दिखावा कर सकते हैं कि ऐसा करता है।)

बड़े अंत में, लेआउट इस तरह कुछ होगा (सबसे महत्वपूर्ण बिट पहले):

 AAAABBBB BBBBCCCC 

थोड़ा अंत में, लेआउट इस तरह होगा:

 BBBBAAAA CCCCBBBB 

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

यह बहुत मान्यताओं को बनाता है यह भी ध्यान दें कि अधिकांश प्लेटफार्मों पर sizeof(struct x) == 4

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