2016-07-05 8 views
6

मैं बिटफील्ड्स के बारे में विभिन्न प्रश्नों पर कई टिप्पणियों में आया हूं जो दावा करते हैं कि बिटकफील्ड गैर-पोर्टेबल हैं, लेकिन मैं कभी भी स्रोत को खोजने में सक्षम नहीं हूं।सी ++ बिटफील्ड गैर पोर्टेबल क्यों और कैसे हैं?

चेहरे की कीमत पर, मुझे लगता है कि सभी बिटफिल्ड केवल उसी बिट्सफिफ्टिंग कोड के विविधताओं के संकलन के लिए संकलित होंगे, लेकिन जाहिर है कि इसके मुकाबले कहीं अधिक होना चाहिए या उनके लिए ऐसी कोई परेशानी नापसंद नहीं होगी।

तो मेरा प्रश्न क्या है जो बिटफील्ड को गैर पोर्टेबल बनाता है?

+1

किस संदर्भ में उन्हें "असुरक्षित" कहा जाता था? एक लिंक जोड़ें? – anatolyg

+6

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

+0

@anatolyg [लुंडिन की टिप्पणी] (http://stackoverflow.com/questions/35934375/bitfields-in-c-programming-language/35935493#comment59526628_35934375) [इस प्रश्न पर] (http://stackoverflow.com/questions/ 35934375/bitfields-इन-सी प्रोग्रामिंग भाषा/35,935,493)। माना जाता है कि मैंने उन्हें 'असुरक्षित' होने का आरोप नहीं लगाया है जितना मेरे पास 'पोर्टेबल' है, लेकिन फिर भी। – Pharap

उत्तर

2

बिट फ़ील्ड इस अर्थ में गैर पोर्टेबल हैं कि बिट का ऑर्डर अनिर्दिष्ट है। इसलिए एक कंपाइलर के साथ इंडेक्स 0 पर बिट एक और कंपाइलर के साथ आखिरी बिट हो सकता है।

यह स्मृति-मैप किए गए हार्डवेयर रजिस्टरों में टॉगलिंग बिट्स जैसे अनुप्रयोगों में बिट फ़ील्ड के उपयोग को रोकता है।

लेकिन, आप हार्डवेयर विक्रेता को उनके द्वारा जारी किए गए कोड में बिटफील्ड का उपयोग करेंगे (उदाहरण के लिए माइक्रोचिप की तरह)। आमतौर पर, ऐसा इसलिए होता है क्योंकि वे इसके साथ कंपाइलर भी जारी करते हैं या एक एकल कंपाइलर को लक्षित करते हैं। उदाहरण के लिए माइक्रोचिप मामले में, उनके स्रोत कोड के लिए लाइसेंस आपको अपने स्वयं के कंपाइलर (8 बिट्स कम अंत उपकरणों के लिए)

@Pharap द्वारा निर्देशित लिंक (सी ++ 14) का एक निकास शामिल है इस अन-निर्दिष्ट ऑर्डरिंग से संबंधित मानक: is-there-a-portable-alternative-to-c-bitfields

+2

वह बिट फ़ील्ड लेआउट कार्यान्वयन-परिभाषित है * * बिट फ़ील्ड को गैर-पोर्टेबल बनाता है। यह कोड एक विशिष्ट लेआउट मानता है जो गैर-पोर्टेबल है। – 4386427

+0

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

+0

@ 4386427 एक भाषा निर्माण पोर्टेबल या पोर्टेबल नहीं है। यह एक कंपाइलर द्वारा समर्थित या नहीं है। पोर्टेबिलिटी के बारे में बात करते समय हम हमेशा इन संरचनाओं के * उपयोग * के बारे में बात करते हैं। मुझे नहीं लगता था कि इसे सटीक बनाना आवश्यक था। – fjardon

8

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

ऐसा इसलिए है क्योंकि 1. प्रोसेसर की शब्द लंबाई भिन्न होती है, और इसके कारण, पूर्णांक प्रकारों के आकार भिन्न होते हैं (1.1 बाइट लंबाई भी भिन्न हो सकती है, लेकिन यह दिन एम्बेडेड सिस्टम के बाहर दुर्लभ है)। और क्योंकि 2. बाइट एंडियननेस प्रोसेसर में अलग है।

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

बिट फ़ील्ड नियमित पूर्णांक प्रकारों पर निर्माण करते हैं, इसलिए उन्हें अंतहीनता और पूर्णांक आकारों के साथ समान समस्याएं होती हैं। लेकिन उनके पास even more कार्यान्वयन निर्दिष्ट व्यवहार है।

  • वर्ग वस्तु के भीतर बिट क्षेत्रों की वास्तविक आवंटन विवरण

    • उदाहरण के लिए, कुछ प्लेटफार्मों पर, बिट क्षेत्रों बाइट्स में फैल गए नहीं है, दूसरों को वे
    • करना पर बारे में सब कुछ इसके अलावा, कुछ प्लेटफार्मों पर, बिट फ़ील्ड बाएं से दाएं पैक होते हैं, अन्य पर दाएं से बाएं
  • चाहे चा आर, लघु, int, लंबा, और लंबे लंबे फ़ील्ड जो स्पष्ट रूप से हस्ताक्षरित या हस्ताक्षरित नहीं हैं हस्ताक्षरित या हस्ताक्षरित हैं।

endianness के विपरीत, यह "सब कुछ वास्तविक आवंटन विवरण के बारे में" एक विहित प्रपत्र में बदलने के लिए तुच्छ नहीं है।

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


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

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