C11, निम्नलिखित struct में काम करते हुए की जीसीसी कार्यान्वयन में बग:बिट क्षेत्रों
struct S {
unsigned a : 4;
_Bool b : 1;
};
एक unsigned
(4 बाइट्स) जिनमें से 4 बिट्स उपयोग किया जाता है के रूप में जीसीसी से बाहर रखी हो जाता है, एक _Bool
द्वारा पीछा किया (4 बाइट्स) जिनमें से 1 बिट का उपयोग 8 बाइट्स के कुल आकार के लिए किया जाता है।
ध्यान दें कि सी 99 और सी 11 विशेष रूप से _Bool
को बिट-फील्ड सदस्य के रूप में अनुमति देते हैं। सी 11 मानक (और शायद बहुत C99) भी §6.7.2.1 'संरचना और संघ विनिर्देशक' ¶11 के तहत कहा गया है कि:
कार्यान्वयन किसी भी पता भंडारण इकाई इतना बड़ा थोड़ा-क्षेत्र धारण करने के लिए आवंटित कर सकते हैं। यदि पर्याप्त जगह बनी हुई है, तो एक बिट-फील्ड जो संरचना में एक और बिट-फील्ड का तुरंत पालन करता है उसे उसी इकाई के आसन्न बिट्स में पैक किया जाएगा।
तो मुझे विश्वास है कि सदस्य b
ऊपर भंडारण इकाई सदस्य a
के लिए आवंटित, कुल आकार 4 बाइट्स की एक struct में जिसके परिणामस्वरूप में पैक किया जाना चाहिए था।
जीसीसी सही ढंग से कार्य और जब दो सदस्यों के लिए एक ही प्रकार का उपयोग कर पैकिंग होती है, या जब एक unsigned
और अन्य signed
, है, लेकिन प्रकार unsigned
और _Bool
जीसीसी यह उन्हें संभाल करने के लिए से भी अलग समझा जा करने लगते हैं सही ढंग से।
क्या कोई मानक की मेरी व्याख्या की पुष्टि कर सकता है, और यह वास्तव में एक जीसीसी बग है?
मुझे काम के आसपास भी कुछ दिलचस्पी है (कुछ कंपाइलर स्विच, प्राग्मा, __attribute__
...)।
मैं जीसीसी 4.7.0 का उपयोग कर रहा साथ -std=c11
(हालांकि अन्य सेटिंग्स समान व्यवहार प्रदर्शित करते हैं।)
ध्यान दें कि जीसीसी एक्सटेंशन '__attribute__ ((पैक)) 'सदस्यों को यहां लागू किया जा सकता है , लेकिन इस समस्या के लिए ऑर्थोगोनल है (इसके परिणामस्वरूप आकार 4 + 1 = 5 की संरचना होती है, यानी एक ही समस्या के साथ।) – ndkrempel
संबंधित: http://stackoverflow.com/questions/308364/c-bitfield-packing-with -बूल (लेकिन सी ++ को संदर्भित करता है, जो कि बिट-फ़ील्ड पर अपने शब्दों में सटीक नहीं है।) – ndkrempel
ऊपर दिए गए प्रश्न के उत्तर के अनुसार, यह व्यवहार जीसीसी 4.2.4 में नहीं हुआ था, इसलिए हो सकता है तब से एक प्रतिगमन। – ndkrempel