2014-11-03 11 views
6

फ़ौवारा इस बयान एक शून्य चौड़ाई सा क्षेत्र पैदा कर सकता है अगले क्षेत्र अगले कंटेनर सीमा पर गठबंधन किया जाना जहां कंटेनर बिट क्षेत्र के अंतर्निहित प्रकार के रूप में एक ही आकारसी में शून्य लंबाई बिट फ़ील्ड के लिए विभिन्न प्रकार?

व्यवहार में कहें है मानते हैं कि int 2 बाइट्स (16 बिट्स) है और यह टाइपिंग को बचाने के लिए 1 बाइट (8 बिट्स) छोटा है। साथ ही मान लें कि हम जीसीसी कंपाइलर का उपयोग कर रहे हैं (झगड़े के मतभेदों को समझाने के लिए अच्छा होगा)।

struct foo { 
    unsigned int a:5; 
    unsigned int :0; 
    unsigned int b:3; 
} 

स्मृति में इस लग रहा है

तरह
struct address 
    |    
    | 
    v 
    aaaaa000 00000000 bbb00000 00000000 

प्रश्न 1: मेरी समझ में यह कंटेनर सीधे वर्तमान कंटेनर निम्नलिखित से तालमेल aaaaa000 00000000 0..00bbb00000... नहीं की तरह देखो, तो bbb है सकते हैं। क्या यह वास्तव में सच है? अगर मैं

struct bar { 
    unsigned short x:5; 
    unsigned int :0; 
    unsigned short y:7; 
} 

यह इतना की तरह हो जाएगा निर्दिष्ट

, पर बदल रहे हैं?

struct address 
    | short stops here   short starts 
    |  |     | 
    v  v | this is uint | v    
    xxxxx000 00000000 00000000 yyyyyyy0 

संपादित करें 1 यह बताया गया है कि कम से कम समय में 16 बाइट्स नहीं हो सकता। यह इस सवाल में बिंदु के बगल में थोड़ा सा है। लेकिन अगर आप के लिए अपनी महत्वपूर्ण है कि आप के साथ short

+0

कौन सा कंपाइलर? बिटफील्ड में बहुत सारे कार्यान्वयन-विशिष्ट विवरण हैं। –

+0

@CarlNorum ने सवाल संपादित किया। – user10607

+0

टाइप स्विचेस के दौरान भी बिटफील्ड को संरेखण के लिए पैडिंग मिलती है, इसलिए आपका नमूना सही नहीं है। –

उत्तर

1

अद्यतन, पाठ in context पढ़ने के बाद: (char उपयोग करने के लिए सही)

अपने उदाहरण का परिणाम:

char pad pad  int boundary 
    | | |  | 
    v v v  v  
    xxxxx000 00000000 yyyyyyy0 

(मैं एंडियन को अनदेखा कर रहा हूं)।

शून्य-लंबाई बिटफील्ड स्थिति को अगले int सीमा पर ले जाने का कारण बनता है। आपने int को 16-बिट होने के लिए परिभाषित किया है, इसलिए 16 शून्य 5 पैडिंग के 11 बिट देता है।

यह एक संपूर्ण खाली int डालें। आपके द्वारा लिंक किए गए पृष्ठ पर उदाहरण यह दर्शाता है (लेकिन 32-बिट पूर्णांक का उपयोग करके)।

+0

यहां संदर्भ के लिए लिंक http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=%2Fcom.ibm.vacpp6m.doc%2Flanguage%2Fref%2Fclrc03defbitf.htm – user10607

+0

मैंने किया कुछ और पढ़ना और आपका जवाब अच्छी तस्वीर को अच्छी तरह से फिट करता है। धन्यवाद! – user10607

-1

सबसे पहले, जब भी लिख बिट क्षेत्रों, यह हमेशा की सिफारिश की है कि आप या तो आरोही या इस्तेमाल किया डेटाटाइप्स के आकार उतरते चर घोषित char और int साथ short बदल सकते हैं। इस तरह संकलक हमेशा उच्चतम डेटाटाइप आकार चुनता है और यह उसी आकार के टुकड़े बनाता है।

यह वही है जो मुझे लगता है। (यह मानते हुए 16-बिट int)

struct bar { 
    unsigned char x:5; 
    unsigned int :0; 
    unsigned char y:7; 
} 

इस प्रकार दिखाई देगा:

struct address 
| short stops here   short starts 
| |     | 
v v| this is unit  | v    
xxxxx000 00000000 00000000 yyyyyyy0 
+5

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

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