2016-11-17 5 views
5

सी structs में, यह इस तरह के प्रकार के डिफ़ॉल्ट बिट लंबाई से एक और बिट लंबाई निर्दिष्ट करना संभव है:सी ++ कक्षाओं में बिट फ़ील्ड का उपयोग किया जा सकता है?

struct MyStruct{ 
    int myVar : 1; //Size of myVar is 1 bit (so it can take values 0 or 1 
    int myOtherVar: 4; //Size of myOtherVar is 4 bits (so it can take values 0 to 15) 
} 

इस बिट क्षेत्रों कहा जाता है।

मेरा प्रश्न है, तो यह भी इस तरह सी में यह करने के लिए ++ कक्षाएं, संभव है:

class MyClass{ 
    public: 
     //Some methods 
    private: 
     int m_myAttribute : 1; 
     int m_myOtherAttribute : 4; 
} 

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

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

+1

यह आपके प्रश्न का उत्तर नहीं देगा, लेकिन प्रासंगिक हो सकता है: http://stackoverflow.com/questions/3319717/is-there-a-bit-equivalent-of-sizeof-in-c –

+0

आप इसे 'आकार' से देख सकते हैं() 'समारोह। साथ ही, जहां तक ​​मुझे पता है, structs और कक्षाओं के बीच एकमात्र अंतर है, डिफ़ॉल्ट वर्ग चर ** निजी ** होगा, डिफ़ॉल्ट संरचना परिवर्तक ** सार्वजनिक ** होगा। आपको यहां पढ़ना चाहिए: [http://stackoverflow.com/a/7762179/1867076] – Prometheus

+2

कक्षाएं, सी ++ में, लगभग हर तरह से structs के समान हैं। ** केवल ** अंतर डिफ़ॉल्ट पहुंच विनिर्देशक है (वर्गों के लिए - निजी, structs के लिए - सार्वजनिक) –

उत्तर

8

हाँ एक class सा मैदान सदस्यों हो सकता है। C++ में एक class और डिफ़ॉल्ट पहुंच का स्तर और डिफ़ॉल्ट विरासत प्रकार के अलावा एक struct के बीच कोई अंतर नहीं है। वे दोनों वर्ग प्रकार कहा जाता है। यदि आप struct में कुछ कर सकते हैं तो आप उसी चीज को class में कर सकते हैं। चूंकि डिफ़ॉल्ट पहुंच स्तर भिन्न होते हैं, इसलिए वे थोड़ा अलग दिखाई देंगे लेकिन आपको वही चीज़ मिल जाएगी। उदाहरण के लिए

struct foo 
{ 
    int m_myAttribute : 1; 
    int m_myOtherAttribute : 4; 
    int m_myOtherOtherAttribute : 27; 
}; 

class bar 
{ 
public: 
    int m_myAttribute : 1; 
    int m_myOtherAttribute : 4; 
    int m_myOtherOtherAttribute : 27; 
}; 

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

अब सी ++ में थोड़ा क्षेत्रों के आकार के बारे। [class.bit]/1 में उस सारी जानकारी की आपको आवश्यकता है:

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

जोर मेरा

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

+1

'डिफ़ॉल्ट पहुंच स्तर '* और डिफ़ॉल्ट प्रकार के विरासत * को छोड़कर, हालांकि इसका उपयोग यहां नहीं किया जाता है। – Ruslan

+0

@Ruslan अपडेट किया गया। – NathanOliver

+0

जब आप कहते हैं कि दो कोड समान हैं, तो क्या आपका मतलब है कि संकलित कोड सख्ती से समान हैं या केवल वे एक ही काम करते हैं? –

0

कार्यान्वयन (QoI) की गुणवत्ता की बात है, हाँ सदस्यों के आकार वास्तव में सभी compilers मैं के बारे में पता के साथ निर्दिष्ट आकार के होते हैं।

आप अगर आकार चाहिए से मेल खाते हैं (मानक के अनुसार) पूछ रहे हैं, तो आप अपने आप से पूछना करने के लिए आप कैसे बता होता है? (एक मानक अनुरूप तरीके से।) यदि आप नहीं कर सकते (और मुझे नहीं लगता कि आप कर सकते हैं), तो एएस-नियम के तहत, संकलक इसे पसंद कर सकता है।

अधिक जानकारी के लिए C++14 standard की धारा 9.6 देख (वास्तव में n4296।)

2

यह सी में पूरी तरह से कानूनी है ++ वर्ग या structs के साथ थोड़ा-क्षेत्रों का उपयोग करने के लिए। मैं भी समानता और के दो मतभेद में आगे गोता लगाने के लिए इस सवाल का सुझाव देते हैं: What are the differences between struct and class in C++?

और हाँ सा आकार वास्तव में ध्यान में रखा जाता है, बस याद है कि स्मृति लेआउट के आकार कार्यान्वयन पर निर्भर

class test { 
    int a : 3; 
    void fun() { 
     // std::cout << sizeof(a); // Illegal (*) 
     a = 5; // Warning! Implicit truncation from int to 3-bit bitfield yields -3 (2's complement) 
    } 
}; 

int main() { 
    std::cout << sizeof(test); // ABI-dependent, might be 4 bytes 
} 

(*) मुझे भी sizeof और बिट-क्षेत्रों के उपयोग के संबंध अपनी टिप्पणी को संबोधित करते हैं: यह नहीं एक glvalue थोड़ा-क्षेत्र को निर्दिष्ट पर sizeof उपयोग की अनुमति दी है के रूप में [expr.sizeof]/p1

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

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