एक वर्ग की बिट चौड़ाई

Dec 06 2020

एक वर्ग घोषित किया गया है:

class Payload {
    uint8_t m_a : 1;
    uint8_t m_b : 5;
    uint8_t m_c : 2;
    uint8_t m_d : 4;
};

आप देखते हैं, sizeof(Payload) == 2। अब तक सब ठीक है। बिट्स की कुल मात्रा 12 है, यह 8 बिट से अधिक है इस प्रकार 2 बिट्स का कब्जा है।

लेकिन क्या कोई तरीका है कि कक्षा द्वारा घोषित बिट्स की मात्रा कैसे प्राप्त करें? मेरा मतलब '12' लौटाने से है ...? किसी भी प्रकार के वर्ग निर्धारण बिटफ़िल्ड के लिए काम कर रहे एल्गोरिदम को सुनिश्चित करें, जैसा कि किसी भी आकार की सैद्धांतिकता ...

जवाब

1 dfrib Dec 06 2020 at 04:16

नहीं, मानक-अनुरूप तरीके से नहीं।

[class.bit] / 1 :

बिट-फ़ील्ड विशेषता वर्ग के सदस्य के प्रकार का हिस्सा नहीं है

जिसका अर्थ है कि यह जानकारी संकलन समय पर नहीं निकाली जा सकती। रनटाइम आत्मनिरीक्षण तकनीकों का उपयोग करके इस जानकारी को खोजने के लिए किसी भी तरह का प्रयास, सबसे अच्छा, कार्यान्वयन परिभाषित व्यवहार पर निर्भर करेगा।

1 Sneftel Dec 06 2020 at 03:32

sizeof(Payload)*CHAR_BIT। यह बाइट्स में संरचना का आकार प्राप्त करता है और इसे बाइट प्रति बिट की संख्या से गुणा करता है (यह तकनीकी रूप से हमेशा 8 नहीं है)। यह काम करता है क्योंकि बिटफ़ील्ड युक्त संरचना बिट्स में एक आकार नहीं हो सकती है जो कि एक से अधिक नहीं है CHAR_BIT। कंपाइलर अंतिम सदस्य के बाद पैडिंग बिट्स जोड़ देगा।